什么是策略模式?

策略模式,即定义一组算法,将每一个算法封装起来,从而使它们可以互相切换。

定义 n 个算法,通过一个类 A,去调用下面的路由,new 不同的策略。

特点

  • 一组算法,那就是不同的策略

  • 这组算法都实现了相同的接口或者继承相同的抽象类,所以可以互相切换。

策略模式涉及到的角色有 三个:

  • 封装角色:

    • 上层访问策略入口,它持有抽象角色策略的引用

  • 抽象策略角色:

    • 提供接口或者抽象类,定义策略组必须拥有的方法和属性

  • 具体策略角色:

    • 实现抽象策略,定义具体的算法逻辑

 1 package 策略模式;
 2 
 3 public class strategyContext {
 4     public static void main(String[] args) {
 5         Context context = new Context(new ConcreteStrategyA());
 6         context.contextInterface();
 7     }
 8 }
 9 
10 // 封装角色
11     // 定义一个 context 类
12         // 持有策略的抽象类,并提供调用策略的方法
13 class Context {
14     private Strategy strategy;
15 
16     /**
17      * 传进的是具体策略实例
18      * @param strategy
19      * */
20     public Context(Strategy strategy) {
21         this.strategy = strategy;
22     }
23 
24     /**
25      * 调用策略
26      * */
27     public void contextInterface() {
28         strategy.algorithmLogic();
29     }
30 }
31 
32 // 抽象策略角色
33     // 定义了策略的方法
34 interface Strategy {
35     public void algorithmLogic();
36 }
37 
38 class ConcreteStrategyA implements Strategy {
39     @Override
40     public void algorithmLogic() {
41         // 具体的策略逻辑
42         System.out.println("执行具体的策略逻辑");
43     }
44 }

策略模式的优点:

  • 策略模式提供了管理相关的算法族的办法,策略类的等级结构定义了一个算法或行为族,恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  • 使用策略模式 可以避免使用多重条件(if - else)语句,多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合到一起,统统列在 一个多重条件语句里面,比使用继承的办法还要原始和落后 。

策略模式的缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一种策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况

  • 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。