1. 是什么
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
1. 抽象策略角色 - 接口或者抽象类
2. 具体策略角色
3. 环境角色 - 持有策略类的引用,最终给客户端调用
2. 代码编写
抽象策略角色
1 2 3
| public interface Cal { int calate(int a,int b); }
|
具体策略角色
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class AddCal implements Cal { @Override public int calate(int a, int b) { return a + b; }
} public class SubCal implements Cal { @Override public int calate(int a, int b) { return a - b; } }
|
环境类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Environment {
Cal cal = null;
public Environment(Cal cal) { this.cal = cal; }
public int invokeCal(int a , int b) { return cal.calate(a,b); }
public void setCal(Cal cal) { this.cal = cal; } }
|
测试代码:
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
| public class StrategyTest {
public static void main(String[] args) {
AddCal cal = new AddCal();
Environment environment = new Environment(cal);
environment.setCal(cal);
int i = environment.invokeCal(1, 2);
System.out.println(i);
environment.setCal(new SubCal());
System.out.println(environment.invokeCal(1,2));
}
}
|
输出:
3
-1
3. 优缺点
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。3. 客户端必须要知道所有的实现类
注意事项:
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。