23种设计模式之策略模式——小鸭子的故事
参考书《Head First 设计模式》
本文基于假设:只有我自己看。为了防止误公开,特此声明,本文内容未必有用【doge】
该书案例采用Java,但是自己是C++爱好者,不过侯捷老师讲课时会顺其自然的引入设计模式,所以理解起来并不难。
由于是23个模式,所以采用字母索引
A 策略模式
该例子是一群小鸭子,这群小鸭子吧,有的会飞!,有的会叫,有的会像火箭一样发射,有的啥也不会。
于是,就出现了一个问题,我们设计的鸭子类需要能够动态调整它具有哪些功能,接下来就是版本的迭代:
- 首先是一个简单的类,把所有方法都写进父类里,子类继承时再考虑实现。但是这样新增加功能就,牵一发而动全身,父类一变,子类全部遭殃。
此时根据第一条设计原则 : 将易变的部分与不变的部分拆分开来 - 于是考虑鸭子们共同的特征与不同的行为,将行为单独拆出来,按照行为的种类设计成不同的类,比如会不会飞,怎么飞,算一个类,然后怎么叫,是另一个类。
第二条设计原则:针对接口编程,而不是针对实现编程 - 最后整理小鸭子和他们的行为,采用委托delegate(composition by reference),也就是通过组合,委托行为类去实现行为。
第三原则:多用组合,少用继承 - 最后的方案优点是行为已经完全独立于鸭子了,可以自由复用了,并且可以动态的修改委托,实现不同的行为转换,妙。
小记:侯捷老师真的是大师,庖丁解牛,在短短几个小时的课程中就学会了好多东西,而且顺其自然,设计模式看起来就是对组合和继承乃至更基本的语法的妙用,大师的经验就在那里,能理解吸收多少全看自己的造化。
最后是策略模式高大上的定义
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
23种设计模式之策略模式——小鸭子的故事相关推荐
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式
· 策略模式在王者荣耀中的应用 · 应用一:[登录游戏前]选择通过何种方式登录游戏 应用二:[游戏开始前]选择英雄及其召唤师技能 应用三:[游戏开始后]选择使用普攻还是技能 一.简述 登录游戏前,玩家 ...
- 23种设计模式之策略模式
策略模式的定义 定义: 定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换 通俗的说, 就是对一个接口下的一组算法进行封装 其类图如下: 其中三个角色说明: Strategy 抽象策略角色 ...
- java 23 种设计模式-23-java 策略模式(Strategy Pattern)
目录 目录 策略模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运 ...
- 23种设计模式之命令模式和策略模式的区别
文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...
- 23种设计模式7_代理模式之一静态代理
23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...
- 23种设计模式——装饰者模式
文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...
- 实践GoF的23种设计模式:建造者模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...
- 【Go实现】实践GoF的23种设计模式:命令模式
上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...
- 挑战30秒记住23种设计模式,顺口溜【一个连贯的故事】
二十三种设计模式图 23种设计模式 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- 23种设计模式之代理模式
文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...
最新文章
- C语言网络编程:accept函数详解
- 探讨ASP.NET 2.0中的Web控件改进技术(3)
- C 中 main 函数的参数
- go 语言系列 (四)位操作用法
- 关于Exchange邮箱服务器角色故障排查及解决思路分享
- To shade or not to shade
- set python3_python3学习之set集合
- SpringBoot配置多数据源(动态切换)
- 学习笔记(16):GIS遥感科技论文写作技巧与方法初探-地理探测器
- VGG16和VGG19网络结构图
- Ubuntu环境下下载Android-SDK-Linux之后使用adb连接设备报错
- VBA调用sqlserver带参数的存储过程
- XML中输入特殊符号
- 【初探篇】Nginx 虚拟主机与域名解析
- 虚拟机下的SYN Flood测试
- 苹果屏幕上的小圆点_原来苹果手机内置录屏功能,简单设置就打开,好多人没发现!...
- 2019 年第 25 周 DApp 影响力排行榜 | TokenInsight
- 朝花夕拾 - jsliang 大白前端新年庆
- 查询课程数mysql_mysql_数据查询练习
- CUDA----.cpp文件和.cu文件应用区别