设计模式学习之锦囊妙计定乾坤
定义:
策略模式很简单,最基本的理解是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。更通俗的讲,就是每个封装的算法名都是一样的,而且算法类都是隶属一个父类。而如何实现互换呢,而互换实际只的是由调用方来决定调用哪个算法,而且之前不受影响。
重点:算法封装、算法互换
实现方式:
需求:小明的妈妈给了小明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判断,策略模式是个不错的现在。
- 策略模式的缺点:策略会很多,而且策略类大多都不可复用;策略类的完全暴露不符合迪米特法则,需要用其他方式弥补。
设计模式学习之锦囊妙计定乾坤相关推荐
- 设计模式——23种设计模式学习总结
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. 系列文章目录 简单工厂模式 策略模式模式 装饰模式(进行中) 代理模式(进行中) 工厂方法模式 ...
- 设计模式 - 学习笔记 - 适配器模式AdapterPattern
设计模式 - 学习笔记 - 适配器模式AdapterPattern 学习总结 UML 代码演示 电源插座 ElectricalSocket 两口插头 Plug USB公口 手机充电器(适配器) Cha ...
- 设计模式 - 学习笔记 - 工厂模式Factory Pattern
设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...
- 36设计模式学习笔记
设计模式学习笔记 文章目录 0.设计模式简介 1.单例模式 2.工厂方法 3.抽象工厂 4.责任链模式 5.模板方法 ok 一.模板方法简介 二.模式的定义和特点 三.模式的结构和实现 四.什么是模板 ...
- java/android 设计模式学习笔记(6)---适配器模式
这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...
- 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)
园子里讲设计模式的太多了,最近我也在学设计模式,把我自己练的一些代码整理下,写个.NET设计模式学习笔记来让自己在设计模式的功底更深一层. 记得金庸小说里风清扬教令狐冲的时候,说过独孤九剑的总纲,无招 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- java/android 设计模式学习笔记(1)--- 单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...
- Builder (建造者) — 【面向对象设计模式学习】
Builder (建造者) - [面向对象设计模式学习] By CityWalker 2010年3月19日 Intent Separate the construction of a complex ...
最新文章
- nginx特定的 404页面利于seo
- Alpha阶段项目总结
- android scrollview 布局,Android scrollview实现底部继续拖动查看图文详情
- SpringBoot配置属性之Server
- 干货+福利!MySQL常见的面试题+索引原理分析!
- 【刷算法】两个链表的第一个公共结点
- macbook服务器文件,使用MacBook生成服务器使用的p12证书文件
- Fiori extension hook和Hybris的template
- 你好,C++(2)1.3 C++世界版图1.4 如何学好C++
- linux system更好方法,Linux将程序添加到服务的方法(通用【但最好还是用systemd】)...
- php有哪些高级扩展,php扩展有哪些
- @WebService作用
- 为eclipse安装python、shell开发环境和SVN插件
- hdoj2050折线分割平面(递推,找规律)
- 安装丰桥(顺丰)电子面单自助打印SDK踩的坑
- 镜像下载vscode
- PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点
- 华为手机8.0.0怎么找到云相册_华为手机里的相册照片删除了怎么找回?
- python-编程训练题
- Google hack语法
热门文章
- 看雪3万课程笔记-Frida 辅助分析ollvm字符串加密(一)
- 【Servlet】servlet上传文件
- html visibility属性,CSS属性参考 | visibility
- html5支持4k视频播放器,哪个是最好的4K视频播放器?五个最佳播放软件(个人经验)...
- [转载] Java是剑客-飘逸;.NET是刀客-霸道 (一)
- python支持强大的科学计算功能_用 Python 写高效科学计算程序设计
- word打印机显示服务器脱机,excel服务器-办公室常识——共享服务器文件报错,共享打印机无法打印的解决办法(解决word、excel不能打印))...
- FlexRay汽车通信总线介绍及测试环境
- 编程之美--游戏之乐--1.3一摞烙饼的排序
- matlab画图中颜色渐变