个人理解
策略模式封装了算法族,其设计的目标在于对容易发生变化的行为(算法)进行封装,使其在不影响源代码的基础上容易添加删除行为(算法)。
应用场景
-
- 主要用于在类与类之间的表现在行为不同,运行时需要选择不同的行为,策略模式则封装了这些行为
- 考虑到不同的情况会应用不同的算法,也用策略模式封装算法
所体现的设计原则
-
- 对修改封闭,对扩展开放(想要添加新的行为不用修改原有代码)
- 多用组合,少用继承
- 封装易变化的行为
- 针对接口编程,而不是对实现编程
主要组成
-
- 抽象策略 接口或者抽象类都行
- 具体策略 实现了接口定义具体的行为或算法
- 环境类 保留了一个抽象策略的引用
优点v
- 使用策略模式有时避免了写条件选择语句
- 使程序变的易于扩展
s缺点
- 客户端必须知道策略类才能决定用哪个
- 容易造成类爆炸
类图
简单举例
一个选择苹果或者橘子的策略模式简单应用
抽象的策略接口
package strategy_01;
public interface ChooseFruitStrategy {
public void chooseFruit();
}
策略具体实现(苹果)
package strategy_01;
public class ChooseApple implements ChooseFruitStrategy{
public void chooseFruit() {
System.out.println("选择苹果");
}
}
策略具体实现(橘子)
package strategy_01;
public class ChooseOrange implements ChooseFruitStrategy{
public void chooseFruit() {
System.out.println("选择橘子");
}
}
环境类
package strategy_01;
public class FruitContext {
ChooseFruitStrategy cfs;
public FruitContext(ChooseFruitStrategy cfs) {
this.cfs=cfs;
}
public void makeChoice(){
cfs.chooseFruit();
}
}
客户端
package strategy_01;
public class Client {
public static void main(String[] args) {
FruitContext fc=new FruitContext(new ChooseApple());
fc.makeChoice();
}
}