你确定你真的对记住了所有的设计模式了吗?
各个设计模式的详细介绍都已经完成,但是不经常用总会忘,所以我想用 一句话
总结设计模式,思考模式的真正意图,再用 一点提示
来思考代码如何实现
我整理的设计模式这一个系列,主要是结合了以下几本书 :
《设计模式:可复用面向对象软件的基础》
: 个人觉得如果想系统学习设计模式必须看的一本书,阅读是有一定难度的,但是它有很多其他书没有涉及到细节介绍《大话设计模式》
: 设计模式入门必看的书籍,用对话的形式以及很多形象的例子很生动的介绍各个设计模式,就一句话,看着不累的书就很厉害《head first 设计模式》
和 《设计模式之禅》
等: 个人是将这些做补充的来看的,在阅读前 2 本书出现一些疑惑的时候,这些书会以一些其他巧妙的角度带我加深理解这些书怎么找 pdf 版本呢? 之前分享过 私货 ,我也是在上面直接搜索下载的~
接下来将按设计模式目的分类,逐个一句话
和 一点提示
总结设计模式,如果发现对某种设计模式记忆不清晰或者说有什么疑惑,可以直接跳转到该设计模式的详细介绍中再回味一下~
注意:我整理的设计模式代码实现部分使用的语言是
C++
简单工厂模式 (SimpleFactory
)
提供创建对象的接口
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
工厂方法模式 (FactoryMethod
)
定义一个用于创建对象的接口,让子类决定实例化哪一个类
继承抽象工厂的具体工厂重载父类创建产品的接口,返回它自己对应具体产品
抽象工厂模式 (AbstractFactory
)
提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类
A
风格的具体工厂重载抽象工厂提供创建继承基类的 widget
的 awidget
和继承基类的 label
的 alabel
等等对象接口
B
风格的具体工厂重载返回 bwidget
和 blabel
等等对象
单例模式 (Singleton
)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
需要统一管理资源或者资源共享的时候都可以使用单例模式
(饿汉模式,懒汉模式)
// C++ 11 推荐方式,局部静态变量 static Singleton& getInstance() { static Singleton value; return value; }
建造者模式 (Builder
)
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
指挥者在收到一个待构建对象后,由指挥者决定具体构建过程,当然指挥者可以根据实际情况扩展不同的子类
原型模式 (Prototype
)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
原对象提供类似 clone()
接口,直接获取一个克隆对象
适配器模式 (Adapter
)
将一个类的接口转换成客户希望的另一个接口
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
代理模式 (Proxy
)
为其他对象提供一种代理以控制对这个对象的访问
通过增加中间层(代理层),代理类和真正的对象都继承自相同的基类,客户调用代理类,代理类根据实际情况来操纵真正的对象
桥接模式 (Bridge
)
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
需要跨越多个平台的图形和窗口系统上, 例如: 封装好 绘图
的基类, 基于 windows
或者 linux
等等实现自己的 绘图
子类, 图形
的基类使用 绘图
基类提供的接口绘制, 在此基础上可以实现 三角形
和 正方形
等等基于 图形
的子类
外观模式 (Facade
)
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
将一些复杂模块的代码进行封装从而对客户隐藏具体细节,并且提供给客户更简洁的接口
装饰模式 (Decorator
)
动态地给一个对象添加一些额外的职责
小姐姐: 我的奶茶加冰加奶盖
组成模式 (Composite
)
将对象组合成树形结构以表示 “部分-整体” 的层次结构。组成模式使得用户对单个对象和组合对象的使用具有一致性
文件系统下文件管理系统
享元模式 (Flyweight
)
运用共享技术有效地支持大量细粒度的对象
享元池
,用户需要对象时,首先从 享元池
中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
策略模式 (Strategy
)
将可以互换的行为封装起来,然后使用 “委托” 的方法,决定使用哪一种行为
新用户立减 10 元, 老用户 9 折, 会员 8 折
命令模式 (Command
)
将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
小明妈妈让小张给小明带句话少玩会儿, 早点回家吃饭, 小张刚转身准备去喊,小明妈妈说算了算了,你们玩的开心就好
模板方法 (Template
)
由子类决定如何实现算法的某些步骤
出题人把题目出好了, 写答案的位置也留白出来了, 轮到你们答一答了
观察者模式 (Observer
)
当对象间存在一对多的依赖关系时,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有的观察者对象,使它们能够自动更新自己
前台漂亮的小姐姐, 我把手机号码给你了,老板来了,你可要给我打电话啊!
发布订阅模式 (Publish/Subscribe
)
在观察者模式的基础上进一步解耦合,引入中间件管理复杂的消息分发的规则, 并将状态的改变抽象成任务的发布
rabbitmq
等消息中间件
解释器模式 (Interpreter
)
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
数字的乐谱转换成标准乐谱
职责链模式 (Chain Of Responsibility
)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
– [组长,我想请5天假? – [我没权利批准,我去帮你问问我上级~
备忘录模式 (Memento
)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态
从需要备份的对象中生成一个保存关键数据的备忘录对象,需要恢复的时候,传入这个备忘录对象来还原状态
中介者模式 (Mediator
)
控制和协调一组对象间的交互,中介者充当一个中介以使组中的对象不再相互显式引用,这些对象仅知道中介者,从而减少相互连接的数目
图像化界面一个按键的点击会出现弹窗等等行为
状态模式 (State
)
封装基于状态的行为,并将行为委托到当前状态
红绿灯切换
迭代器模式 (Iterator
)
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示
想想 std::list
等标准库中的源码实现
访问者模式 (Visitor
)
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
将基于共同基类的不同子类元素提供的各种功能抽象成 accept(Visitor *)
接口, Visitor
来封装这些真正的行为
如果可以从这么简单的提醒就能完整的想象出具体的代码实现,那么我的目的就实现了
最后希望大家都能在实际项目灵活的使用这些设计模式,提高代码的可读性和扩展性,当然切记不要硬套~
所以,所以要个 赞
,要个 再看
不过分吧~