当实现某功能需要根据实际情况选择不同的算法或者策略时,可以选择通过硬编码的方式(if-else 或者 switch-case)来实现,但是这样会使这个类变得臃肿,维护成本上升,出错率也变大了。基于这样的情景,如果将这些算法或者策略抽象出来,提供一个统一的接口,不同算法或者策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态替换,这种可扩展性高、可维护性也高的模式就是策略模式。

策略模式的使用情景:

  • 针对同一问题的多种处理方式,仅仅是具体行为有差别时;
  • 需要安全的封装多种同一类型的操作时;
  • 出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时;

if-else 或者 switch-case 并不会遵循开闭原则,而应对这种情况,策略模式就能很好地解决这类问题,它将各种方案分离开来,让程序客户端根据具体的需求来动态地选择不同的策略方案。

1.策略模式

策略模式
优点 1、结构清晰,耦合度降低,扩展方便,操作封装也更为彻底,数据更为安全;
缺点 1、随着策略的增加,子类将变得繁多;

UML 类图:

Context 表示上下文,Stragety 表示策略的抽象,ConcreteStragetyA、ConcreteStragetyB 表示具体的策略实现。

1.代码实现

我们以出行旅游,选择交通工具为例,不同的出行方式(如自行车、火车、飞机)根据不同的选择价格是不一样的。

我们首先需要定义一个抽象的价格计算接口 CalculateStrategy:

public interface CalculateStrategy {/*** 按照距离来计算价格* @param km 公里* @return 返回价格*/int calculatePrice(int km);
}

对于每一种出行方式我们都有独立的计算策略类:

/*** 自行车价格计算策略类*/
public class BikeStrategy implements CalculateStrategy {@Overridepublic int calculatePrice(int km) {// 此处省略return 10;}
}
/*** 火车价格计算策略类*/
public class TrainStrategy implements CalculateStrategy {@Overridepublic int calculatePrice(int km) {// 此处省略return 100;}
}
/*** 飞机价格计算策略类*/
public class AircraftStrategy implements CalculateStrategy {@Overridepublic int calculatePrice(int km) {// 此处省略return 1000;}
}

然后我们再创建一个扮演 Context 角色的类:

public class TranficCalculator {CalculateStrategy mStrategy;public void setStrategy(CalculateStrategy strategy) {mStrategy = strategy;}public int  calculatePrice(int km) {return mStrategy.calculatePrice(km);}
}

测试代码:

@Test
public void test() throws Exception {TranficCalculator calculator = new TranficCalculator();calculator.setStrategy(new TrainStrategy());System.out.println("price:" + calculator.calculatePrice(20));
}

输出结果: price:100

这种方案在隐藏实现的同时,可扩展性变得很强,例如,当需要增加汽车时,只需要添加一个汽车的计算策略类即可。

Java 设计模式情景分析——策略模式相关推荐

  1. Java 设计模式情景分析——建造者模式

    当我们遇到类似汽车的装配,需要车轮.方向盘.发动机,还有各种小零件时,为了在构建过程中隐藏实现细节,就可以使用建造者模式 (Builder模式) 将部件和组装过程分离,使得构建过程和部件都可以自由扩展 ...

  2. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  3. Java设计模式6:策略模式

    策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...

  4. java设计模式之【策略模式】

    策略模式 策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 开启策略模式 我们的的代码中有各种鸭子 突然有一天,我们的需求变了.... 但是这也带来 ...

  5. Java 设计模式情景分析——观察者模式

    观察者模式是一种使用频率非常高的模式,有时也被称作发布/订阅模式,属于行为型模式,它最常用的是 GUI 系统.发布/订阅系统,它一个重要作用就是解耦,使得它们之间的依赖性更小.观察者模式定义了对象间一 ...

  6. 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获!

  7. java策略管理_详解Java编程中的策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式 ...

  8. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  9. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

最新文章

  1. linux Address already in use 端口被占用解决办法
  2. nginx 之负载均衡 :PHP session 跨多台服务器配置
  3. Django使用心得(四)
  4. 012_JDBC模板
  5. java拦截器_Java工程师年底跳槽高潮即将到来,斩获满意offer的必备技巧(二)
  6. this.byId(SupplierForm).bindElement in SAP UI5
  7. 稀疏矩阵的转置c语言程序,程序有问题求大神,稀疏矩阵转置
  8. 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程
  9. 法院才是最童叟无欺的一元店
  10. 老年代的更新机制_如何理解Java GC机制
  11. 跑外卖仅靠吃苦可以吗?
  12. CentOS8 DNF简介 常用命令以及配置本地yum源
  13. 虚拟机ip地址消失不见,重新获取方法
  14. xUtils更新到3.0后的基本使用规则
  15. 句法结构分析:基于PCFG的基本分析方法
  16. TensorFlow中的小知识:tf.flags.DEFINE_xxx()
  17. 浦发笔试考计算机知识么,浦发银行考试:笔试到底考什么?
  18. 【转】艺术设计、数字媒体、环艺、影视动画、摄影、广编专业…等…视频、教程、资讯、图库、作品汇总大全
  19. 怎样快速学习一门计算机编程语言?
  20. 在 Chrome 中清除、启用和管理 Cookie

热门文章

  1. xshell登陆Win10 Linux子系统
  2. “终于我从字节离职了...“一个年薪50W的测试工程师的自白...
  3. iPhone添加163邮箱,提示用户名或密码错误
  4. c语言10.0程序闪退,系统之家xp系统C语言程序闪退的解决方法
  5. iCloud同步测试
  6. autojump输入 j 命令加文件名 无法跳转 显示 ·
  7. [css] 实现文字竖向排列
  8. 数学一年级应用题_小学一年级数学应用题大全(50题)
  9. Unity Profiler分析器
  10. chrome android 分屏,谷歌调整安卓系统:分屏多任务同时支持两款以上APP