设计模式之策略模式
来源:互联网 发布:老板的红颜知已 编辑:程序博客网 时间:2024/06/14 06:51
策略模式是什么?
策略模式通俗的来讲是应用于类似于这样的场景:比如一个人想从A地到B地,他可以选择的方式有好几种:1. 乘坐公交 2. 乘坐的士 3. 乘坐地铁。这三种不同的方式都可以最后到达目的地,只是采用的“策略”不同,一般我们可以在代码中通过if-else这样的分支来达到使用不同的方式去执行。但是这样的方式存在着代码逻辑复杂,越来越难以维护(随着具体执行方式的增加)这也就是“策略模式”需要解决的问题。
针对以上的这样的问题,我们可以通过对具体的执行方式进行抽象,之后建立一个统一的抽象接口,接下来让具体的执行方式去分别实现它,最后通过一个对外调用的接口函数对外实现方法调用就好了。这样的思想就是策略模式的典型实现思想了。
从策略模式的使用角度来说,策略模式适用于以下的场景:
针对同一类型的问题有多种处理方式,仅仅是具体到实现细节上不同
需要安全的封装多种同一类型的操作时
出现同一抽象类有多个子类,而又需要使用 if- else或者switch-case来选择具体子类实现的时候
策略模式实现示例
首先我们将具体的实现方式抽象出一个接口:
public interface CalculateStrategy {/** * @des 传入距离 * @param km * @return */public String calcuateKm(int km);}
定义具体的“策略”,去实现CalculateStrategy接口
- BusStrategy.class
public class BusStrategy implements CalculateStrategy {@Overridepublic String calcuateKm(int km) { return "乘坐公共汽车共需要" + km + "公里";}}
- SubWayStrategy.class
public class SubWayStrategy implements CalculateStrategy {@Overridepublic String calcuateKm(int km) { return "乘坐地铁需要" + km + "公里";}}
构造一个类用来提供调用具体“策略”的接口
public class TranficCalculator {private CalculateStrategy cStrategy;public TranficCalculator(CalculateStrategy strategy) { cStrategy = strategy;}public String getCalcuateKm(int km) { return cStrategy.calcuateKm(km);}}
mian 函数中调用
public class Maintest {public static void main(String[] args) { //将具体的实例带入,通过tranficCalculator调用getCalcuateKm去执行 // 其实这里也使用了一种设计模式:代理模式 TranficCalculator tranficCalculator1 =new TranficCalculator(new BusStrategy()); System.out.println(tranficCalculator1.getCalcuateKm(25)); TranficCalculator tranficCalculator2 =new TranficCalculator(new SubWayStrategy()); System.out.println(tranficCalculator2.getCalcuateKm(25));}
结果显而易见:
乘坐公共汽车共需要25公里
乘坐地铁需要25公里
总结
策略模式主要是用来分离算法,避免if- else类型的过多使用导致的逻辑混乱,不易于维护的问题。在相同的行为抽象下有不同的具体实现策略。该模式很好的体现了开闭原则。通过定义抽象,注入不同的实现,从而达到比较好的拓展性。缺点也有:就是随着具体“策略”的增加,类的数量会变得很多。
阅读全文
1 0
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- Libevent源码分析-----event_signal_map
- 【TopDesk】新项目:总起+目录篇
- Oracle和Mysql数据库的分页怎么写?
- [UOJ 3]【NOI2014】魔法森林:LCT
- Zend Studio 12.0.1 修改默认的项目路径
- 设计模式之策略模式
- CSRF 攻击的应对之道
- jQuery常用方法
- 数字相关知识
- 【整理】单元测试与功能测试的区别
- Libevent源码分析-----配置event_base
- 292. Nim Game
- Unity 鼠标双击
- Android中的Apk的加固(加壳)原理解析和实现