策略模式及实例:四则运算
策略模式 (Strategy Pattern)
定义一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。让算法独立于使用它的客户而独立变化。
UML
策略模式中的角色
- Context封装类角色
- 启承上启下的作用
- 屏蔽高层模块对策略、算法的直接访问
- 封装可能的变化
- Strategy抽象策略角色
- 策略、算法的抽象类
- ConcreteStrategy
- 具体的策略角色
优点
- 算法可自由切换
- 避免使用多重条件判断
- 扩展性良好
缺点
- 类(策略类)数量增多
- 所有的策略类都需要对外暴露
- 与迪米特原则相违背,可用其他模式来修正(工厂、代理、享元等)
使用场景
- 多个类只有在算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
注意事项: 若策略类过多(>4),则需用混合模式来解决类膨胀和对外暴露的问题
实例: 四则运算
定义Strategy抽象策略类
public interface IArithmetic {
double operation(double value1, double value2);
}
定义Context封装类
//计算器
public class Calculator {
private final IArithmetic arithmetic;
public Calculator(IArithmetic _arithmetic) {
this.arithmetic = _arithmetic;
}
public double calc(double value1, double value2) {
return arithmetic.operation(value1, value2);
}
}
定义具体策略类1:加法类
public class Addition implements IArithmetic {
@Override
public double operation(double value1, double value2) {
return value1 + value2;
}
}
定义具体策略类2:减法类
public class Subtraction implements IArithmetic {
@Override
public double operation(double value1, double value2) {
return value1 - value2;
}
}
Client中调用
double value1 = 30;
double value2 = 5;
Calculator calculator;
calculator = new Calculator(new Addition());
Log.i("zhk-MainActivity", "onCreate: " + calculator.calc(value1, value2));
输出结果: 35
改为使用减法
calculator = new Calculator(new Addition());
calculator = new Calculator(new Subtraction());
输出结果: 25
现在,如果还想扩展策略类
变得非常的简单 !
新建乘法类实现IArithmetic
public class Multiplication implements IArithmetic {
@Override
public double operation(double value1, double value2) {
return value1 * value2;
}
}
Client中修改
calculator = new Calculator(new Subtraction());
calculator = new Calculator(new Multiplication());
输出结果: 150
其他
参考 《设计模式之禅第二版》