Strategy-- 策略模式
程序员看问题需要有时间轴的概念, 静态可能暴露不出问题, 要动态的看.
看问题要加上时间轴.
一, 定义
定义一系列算法, 把它们一个个封装起来, 并且使它们互相替换 (变化), 该模式使得算法可独立于使用它的客户程序(稳定) 而变化(扩展, 子类化)
二, 假设场景
根据货币类型, 计算税
1, 传统思路
- public class Strategy1 {
- ?
- /**
- * 根据货币类型, 计算值
- * 变化: 当增加日元, 泰铢等情况时, 只能添加 elseif 的代码, 违背了开闭原则
- * @param tax
- * @return
- */
- public double calculateTax(String tax){
- if(tax.equals("CN_tax")){
- // 人民币
- }
- else if(tax.equals("US_tax")){
- // 美元
- }
- else if(tax.equals("DE_tax")){
- // 英镑
- }
- else{
- // 其他
- }
- return 0;
- }
- }
变化: 当增加日元, 泰铢等情况时, 只能添加 elseif 的代码, 违背了开闭原则
2, 策略模式
- // 货币的税的计算 接口
- public interface Strategy2 {
- double calculateTax(String context);
- }
- ?
- // 人民币转化 实现类
- public class CN_tax implements Strategy2{
- @Override
- public double calculateTax(String context) {
- // 人民币转化
- System.out.println("人民币转化");
- return 0;
- }
- }
- // 美元转化 实现类
- public class US_tax implements Strategy2{
- @Override
- public double calculateTax(String context) {
- // 美元转化
- System.out.println("美元转化");
- return 0;
- }
- }
- // 英镑转化 实现类
- public class DE_tax implements Strategy2{
- @Override
- public double calculateTax(String context) {
- // 英镑转化
- System.out.println("英镑转化");
- return 0;
- }
- }
- ?
- // 应用类
- public class SalesOder {
- private Strategy2 strategy;
- ?
- SalesOder(Object strategyFactory){
- // 使用工厂来创建特定对象
- //strategyFactory.newStrategy()
- }
- ?
- /**
- *
- * @param context 上下文
- * @return
- */
- public double calculateTax(String context) {
- ?
- double val = strategy.calculateTax(context);
- ?
- return val;
- }
- }
变化: 当增加日元, 泰铢等情况时, 添加日元, 泰铢的实现类即可, 不用去改源代码.
- // 日元转化 实现类
- public class JP_tax implements Strategy2{
- @Override
- public double calculateTax(String context) {
- // 日元转化
- System.out.println("日元转化");
- return 0;
- }
- }
- // 泰铢转化 实现类
- public class TA_tax implements Strategy2{
- @Override
- public double calculateTax(String context) {
- // 泰铢转化
- System.out.println("泰铢转化");
- return 0;
- }
- }
三, 总结
Strategy 及其子类为组件提供了一系列可重用的算法, 从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换.
Strategy 模式提供了用条件判断语句以外的另一种选择, 消除条件判断语句, 就是解耦和. 还哪有许多条件判断语句的代码通常都需要 Strategy 模式.
如果 Strategy 对象没有实例变量, 那么各个上下文可以共享同一个 Strategy 对象, 从而节省对象开销.(有时候支持不适用的算法, if else 里有很多代码不会被用到时, 也是性能负担)
来源: http://www.bubuko.com/infodetail-3065421.html