设计模式笔记 - Strategy 策略模式 (Design Pattern)

1、策略模式:

它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

2、策略模式的结构图:

3、策略模式涉及到的角色:

抽象策略角色:(Strategy)策略类,由一个接口或者抽象类实现。

具体策略角色:(ConcreteStrategy)封装了相关的算法和行为的策略类的一个实现。

环境角色:(Context)持有一个策略类的引用,提供给客户端调用的(通过接口调用)。

4、实现代码如下:

4.1、抽象策略角色类:

1
2
3
4
public interface Strategy {

public double calculate(double a,double b);
}

4.2、具体策略角色类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AddStrategy implements Strategy {

@Override
public double calculate(double a, double b) {
return a + b;
}
}
public class SubStrategy implements Strategy {

@Override
public double calculate(double a, double b) {
return a - b;
}
}

4.3、环境角色类:

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

private Strategy strategy;

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

public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}

public double calculate(double a, double b){
return strategy.calculate(a, b);
}
}

4.4、客户端调用:

1
2
3
4
5
6
7
8
9
10
public static void main(String\[\] args) {

AddStrategy add = new AddStrategy();
Context context = new Context(add);
System.out.println(context.calculate(1.2, 1.3));

SubStrategy sub = new SubStrategy();
context.setStrategy(sub);
System.out.println(context.calculate(1.2, 1.3));
}

5、其他说明

提示: 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。 造成很多的策略类。 改进方法: 策略与工厂方法结合。 解决策略类过多带来的弊端,简化客户端的调用。

arthinking wechat
欢迎关注itzhai公众号