设计模式之策略模式

策略模式(Strategy),定义算法家族,分别封装,算法之间可以相互替换,算法的变化不影响使用算法的客户端,属于行为型模式。

在策略模式中,由客户端自己决定在什么情况下使用什么具体策略角色。

组成

策略模式由抽象策略、具体策略和上下文 context 组成。

其中抽象策略定义所支持算法的公共接口;具体策略封装具体的算法、行为,实现抽象策略;context 维护一个策略的引用,提供执行所引用策略的方法。

优点

遵循开闭原则,客户端能够在不修改原有程序的基础上选择算法或行为,也可以灵活地增加新的算法或行为。

可以通过继承将各算法中的公共功能提取出来。

减少各种算法与客户端之间的耦合。

避免使用多重条件判断语句。

简化了单元测试。

缺点

客户端必须知道所有的策略类,并决定使用哪一个策略类(可以通过与简单工厂结合来解决)。

将产生很多策略类。

使用场景

需要在不同场景使用不同的业务规则,就可以使用策略模式。

设计原则

遵循单一职责原则、依赖倒转原则、开闭原则、最小知识原则。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public interface Strategy {
void algorithmInterface();
}

public class ConcreteStrategyA implements Strategy {
@Override
public void algorithmInterface() {
System.out.println("Concrete Strategy A");
}
}

public class ConcreteStrategyB implements Strategy {
@Override
public void algorithmInterface() {
System.out.println("Concrete Strategy B");
}
}

public class Context {

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

public void contextInterface() {
strategy.algorithmInterface();
}
}

public class Client {
public static void main(String[] args) {
Context context;
context = new Context(new ConcreteStrategyA());
context.contextInterface();
context = new Context(new ConcreteStrategyB());
context.contextInterface();
}
}

与简单工厂结合

单独使用策略模式,需要客户端知道所有的策略类,并决定使用哪一个策略类。

与简单工厂结合,可以将策略的选择过程从客户端转到工厂,即 context ,改造后的 context 和客户端如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Context {

private Strategy strategy;
public Context(String strategyType) {
if ("A".equals(strategyType)) {
strategy = new ConcreteStrategyA();
} else {
strategy = new ConcreteStrategyB();
}
}

public void contextInterface() {
strategy.algorithmInterface();
}
}

public class Client {
public static void main(String[] args) {
Context context = new Context("A");
context.contextInterface();
context = new Context("B");
context.contextInterface();
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2016-2020 姜越

谢谢老板

支付宝
微信