定义:

策略模式很简单,最基本的理解是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。更通俗的讲,就是每个封装的算法名都是一样的,而且算法类都是隶属一个父类。而如何实现互换呢,而互换实际只的是由调用方来决定调用哪个算法,而且之前不受影响。

重点:算法封装、算法互换

实现方式:

需求:小明的妈妈给了小明10块零花钱,小明走到了炸鸡店门口,但是开始由于了到底是买鸡腿呢还是买鸡翅呢?

设计思路:小明的10快钱的消费方式就是算法的核心,会有三种情况:1.都买鸡腿,2.都买鸡翅,3.鸡腿和鸡翅 混合买。设计一个消费算法抽象类SaleStrategy,三个具体的实现方式。消费10快钱封装为consumeContext类。

类图:

代码实现:

/*** 策略模式* 算法抽象类*/
public abstract class Strategy {protected abstract void plan();
}/*** 策略模式* 策略1:全部买鸡腿*/
public class SaleStrategy1 extends Strategy{@Overrideprotected void plan() {System.out.println("全部可以三个鸡腿还剩一块钱");}
}/*** 策略模式* 策略2:全部买鸡翅*/
public class SaleStrategy2 extends Strategy{@Overrideprotected void plan() {System.out.println("全部正好可以买5个鸡翅");}
}/*** 策略模式* 策略3:鸡翅和鸡腿都买*/
public class SaleStrategy3 extends Strategy{@Overrideprotected void plan() {System.out.println("全部可以买2个鸡腿和2个鸡翅");}
}/*** 策略模式* 消费行为*/
public class ConsumeContext {private  Strategy strategy;public ConsumeContext(Strategy strategy){this.strategy = strategy;}public void consume(){this.strategy.plan();}
}/*** 策略模式测似类*/
public class TestStrategy {public static void main(String[] args) {//策略1Strategy strategy1 = new SaleStrategy1();ConsumeContext context1 = new ConsumeContext(strategy1);context1.consume();//策略2Strategy strategy2 = new SaleStrategy2();ConsumeContext context2 = new ConsumeContext(strategy2);context2.consume();//策略3Strategy strategy3 = new SaleStrategy3();ConsumeContext context3 = new ConsumeContext(strategy3);context3.consume();}
}//测似结果
全部可以三个鸡腿还剩一块钱
全部正好可以买5个鸡翅
全部可以买2个鸡腿和2个鸡翅

上述代码中对于如何消费10块钱提供了三种策略,每个策略的都提供了消费方法并且都是基于Strategy类实现。在设计过程中,选择的消费方式传入的是Strategy,所以三种策略方法可以互换使用。父类出现的地方,子类都可以出现。

总结:

  • 策略模式的优点:显而易见的高扩展性,新增场景时,很轻松能扩展算法类。算法可以自由切换,通俗的讲就是想用哪个用哪个,这是也可以理解为接口的调用。同时避免了多重语句的判断,与其多重的if else判断,策略模式是个不错的现在。
  • 策略模式的缺点:策略会很多,而且策略类大多都不可复用;策略类的完全暴露不符合迪米特法则,需要用其他方式弥补。

设计模式学习之锦囊妙计定乾坤相关推荐

  1. 设计模式——23种设计模式学习总结

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. 系列文章目录 简单工厂模式 策略模式模式 装饰模式(进行中) 代理模式(进行中) 工厂方法模式 ...

  2. 设计模式 - 学习笔记 - 适配器模式AdapterPattern

    设计模式 - 学习笔记 - 适配器模式AdapterPattern 学习总结 UML 代码演示 电源插座 ElectricalSocket 两口插头 Plug USB公口 手机充电器(适配器) Cha ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. 36设计模式学习笔记

    设计模式学习笔记 文章目录 0.设计模式简介 1.单例模式 2.工厂方法 3.抽象工厂 4.责任链模式 5.模板方法 ok 一.模板方法简介 二.模式的定义和特点 三.模式的结构和实现 四.什么是模板 ...

  5. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  6. 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)

    园子里讲设计模式的太多了,最近我也在学设计模式,把我自己练的一些代码整理下,写个.NET设计模式学习笔记来让自己在设计模式的功底更深一层. 记得金庸小说里风清扬教令狐冲的时候,说过独孤九剑的总纲,无招 ...

  7. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  8. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  9. Builder (建造者) — 【面向对象设计模式学习】

    Builder (建造者) - [面向对象设计模式学习] By CityWalker 2010年3月19日 Intent Separate the construction of a complex ...

最新文章

  1. nginx特定的 404页面利于seo
  2. Alpha阶段项目总结
  3. android scrollview 布局,Android scrollview实现底部继续拖动查看图文详情
  4. SpringBoot配置属性之Server
  5. 干货+福利!MySQL常见的面试题+索引原理分析!
  6. 【刷算法】两个链表的第一个公共结点
  7. macbook服务器文件,使用MacBook生成服务器使用的p12证书文件
  8. Fiori extension hook和Hybris的template
  9. 你好,C++(2)1.3 C++世界版图1.4 如何学好C++
  10. linux system更好方法,Linux将程序添加到服务的方法(通用【但最好还是用systemd】)...
  11. php有哪些高级扩展,php扩展有哪些
  12. @WebService作用
  13. 为eclipse安装python、shell开发环境和SVN插件
  14. hdoj2050折线分割平面(递推,找规律)
  15. 安装丰桥(顺丰)电子面单自助打印SDK踩的坑
  16. 镜像下载vscode
  17. PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点
  18. 华为手机8.0.0怎么找到云相册_华为手机里的相册照片删除了怎么找回?
  19. python-编程训练题
  20. Google hack语法

热门文章

  1. 看雪3万课程笔记-Frida 辅助分析ollvm字符串加密(一)
  2. 【Servlet】servlet上传文件
  3. html visibility属性,CSS属性参考 | visibility
  4. html5支持4k视频播放器,哪个是最好的4K视频播放器?五个最佳播放软件(个人经验)...
  5. [转载] Java是剑客-飘逸;.NET是刀客-霸道 (一)
  6. python支持强大的科学计算功能_用 Python 写高效科学计算程序设计
  7. word打印机显示服务器脱机,excel服务器-办公室常识——共享服务器文件报错,共享打印机无法打印的解决办法(解决word、excel不能打印))...
  8. FlexRay汽车通信总线介绍及测试环境
  9. 编程之美--游戏之乐--1.3一摞烙饼的排序
  10. matlab画图中颜色渐变