设计模式学习(三)

行为模式:用于方法实现以及对应算法的设计模式。

1.策略模式

定义:为了让客户类能够更好地使用某些算法而不需要知道其具体的实现

特点:有一个策略工厂,实际调用由其控制

使用场景:有多种计算方式,或选择方式(如用户选择用哪种支付方式)

设计模式学习(三)_第1张图片
策略模式代码

2.模板方法模式

定义:准备一个抽象类,将部分逻辑以具体方法以及具体构造形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑

特点:为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写/具体的执行顺序和实现由子类自己控制

使用场景:php中的钩子由运用到

设计模式学习(三)_第2张图片
模版方法模式代码

3.观察者模式

定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

特点:低耦合,非侵入式的通知与更新机制

使用场景:某些功能实现后再执行某个功能(如,用户注册成功后给积分,优惠卷等/某些业务逻辑完成后需要记录在log里)

设计模式学习(三)_第3张图片
观察者模式代码

4.迭代器模式

定义:又叫做游标(Cursor)模式。提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节。

特点:继承 Iterator

使用场景:最经典的例子是foreach

设计模式学习(三)_第4张图片
迭代器模式代码一
设计模式学习(三)_第5张图片
迭代器模式代码二

5.责任链模式

定义:控制链模式。它主要由一系列对于某些命令的处理器构成,每个查询会在处理器构成的责任链中传递,在每个交汇点由处理器判断是否需要对它们进行响应与处理。

特点:一定有一个上级,只有最大权限不需要上级

使用场景:权限控制

设计模式学习(三)_第6张图片
责任链模式代码

6.命令模式

定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能

特点:Receive接收者角色:该角色就是干活的角色,命令传递到这里是应该被执行的/Command命令角色:需要执行的所有命令都在这里声明/Invoker调用者角色:接收到命令,并执行命令

使用场景:看这里

设计模式学习(三)_第7张图片
命令模式代码

7.备忘录模式

定义:又叫做快照模式(Snapshot)或 Token 模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在合适的时候将该对象恢复到原先保存的状态

备忘录模式中的角色

使用场景:最经典的就是编辑器的control + z 恢复功能

设计模式学习(三)_第8张图片
备忘录模式代码一
设计模式学习(三)_第9张图片
备忘录模式代码二

8.状态模式

定义: 允许一个对象在其内部状态改变时改变它的行为

状态模式角色

使用场景:多用于层级较多的判断(如电商项目中用户等级判断)

设计模式学习(三)_第10张图片
状态模式代码

9.访问者模式

定义:访问者表示一个作用于某对象结构中各元素的操作

特点:先将访问者传入元素对象的Accept方法中,然后元素对象再将自己传入访问者,之后访问者执行元素的相应方法

使用场景:方法扩展(如下面的代码,如果我需要再添加一个乘法,只需要添加一个visitordiv)

设计模式学习(三)_第11张图片
访问者模式代码一
设计模式学习(三)_第12张图片
访问者模式代码二

10.中介者模式

定义:两个对象想要交互,但是两者自己不去直接发生交互,而是通过中介者将两者的进行交互

使用场景:QQ游戏平台,聊天室、QQ群、短信平台和房产中介

设计模式学习(三)_第13张图片
中介者模式代码

11.解释器模式

定义:给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子

解释器模式角色
设计模式学习(三)_第14张图片
解释器模式使用场景
设计模式学习(三)_第15张图片
解释器模式代码

主要参考文档:点这里,侵权删

总结:不管是什么模式,主要的感觉就是类与类之间的操作,都是为了开发出低耦合高扩展性能的代码(一般会从抽象类或是接口入手)

你可能感兴趣的:(设计模式学习(三))