策略模式

策略模式

定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
策略模式和状态模式的uml图一样
uml

其中,Context是上下文,用一个Strategy来配置,维护一个对Strategy对象的引用;Strategy是策略类,用于定义所有支持算法的公共接口;StrategyA,StrategyB,StrategyC是具体策略类,封装了具体的算法或行为,继承于Strategy。

角色分析

  • Context上下文
    Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
  • 策略角色
    抽象策略角色,是对策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
  • 具体策略角色
    用于实现抽象策略中的操作,即实现具体的算法。
  • Client客户端
    策略调用者

代码

public class StrategyA implements Strategy {
    @Override
    public void work() {
        System.out.println("StrategyA");
    }
}

/**
 * 存放策略的容器
 */
public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void work() {
        strategy.work();
    }
}

public class Test {
    
    /**
     * 采用不同策略执行
     * @param args
     */
    public static void main(String[] args) {
        new Context(new StrategyA()).work();
        new Context(new StrategyB()).work();
        new Context(new StrategyC()).work();
    }
    
}

uml

策略模式的应用

  1. 何时使用
一个系统有许多类,而区分它们的只是他们直接的行为时
  2. 方法
将这些算法封装成一个一个的类,任意的替换
  3. 优点
算法可以自由切换
避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)
扩展性良好,增加一个策略只需实现接口即可
  4. 缺点
策略类数量会增多,每个策略都是一个类,复用的可能性很小
所有的策略类都需要对外暴露
  5. 使用场景
多个类只有算法或行为上稍有不同的场景
算法需要自由切换的场景
需要屏蔽算法规则的场景
  6. 应用实例
出行方式,自行车、汽车等,每一种出行方式都是一个策略
商场促销方式,打折、满减等
Java AWT中的LayoutManager,即布局管理器
  7. 注意事项
如果一个系统的策略多于四个,就需要考虑使用混合模式来解决策略类膨胀的问题

posted @ 2020-09-18 16:03  刃牙  阅读(151)  评论(0编辑  收藏  举报