zoukankan      html  css  js  c++  java
  • 策略模式(Strategy Pattern)

    定义:
     
    定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换,并让算法可以在不影响到客户端的情况下发生变化。
     
    解决的问题:
     
    使得客户端可以根据外部条件选择不同策略来解决不同问题
    • 策略模式仅仅封装算法(包括添加 & 删除),但策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定
    • 让算法和对象分开来,使得算法可以独立于使用它的客户而变化
     
    uml类图:
     
     
     模式组成:
     
    • Context:环境类。用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据
    • Strategy:抽象策略类定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法
    • ConcreteStrategy:具体策略类。以Strategy接口实现某具体算法
     
    优点:
     
    • 策略类之间可以自由切换
    由于策略类都实现同一个接口,所以使它们之间可以自由切换。
    • 易于扩展
    增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“
    • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想
     
     缺点:
     
    • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
    • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
     
    举个栗子:
     
    定义抽象角色类
    interface IStrategy{
        public void show();
    }

    定义具体策略

    class StrategyA implements IStrategy{
        @Override
        public void show() {
           System.out.println("super model show");
        }
    }

    定义具体策略

    class StrategyB implements IStrategy{
        @Override
        public void show() {
           System.out.println(" magic show");
        }
    }

    定义环境类

    class Context{
        static IStrategy st;
        public static void show(String level){
            switch(level){
            case "vip":
                st=new StrategyA();
                break;
            case "member":
                st=new StrategyB();
                break;
            }
            st.show();
        }
    }

    客户端调用

    public static void main(String[] args) {
            Context.show("vip");
        }

    输出

  • 相关阅读:
    c++基础_矩阵乘法
    c++基础_字符串对比
    c++基础_时间转换
    c++基础_特殊回文数
    c++基础_回文数
    c++基础_特殊的数字
    c++基础_杨辉三角形
    c++基础_字母图形
    c++基础_01字串
    java 常用集合类型--以及其特性
  • 原文地址:https://www.cnblogs.com/amei0/p/8057912.html
Copyright © 2011-2022 走看看