装饰器模式
扩展类的原有方法,不需要继承重写,在方法的开始和结尾增加预处理方法
前言
装饰器的思想就是方便对一个方法进行扩展,就和web框架中提供的 beforeAction
和 afterAction
一样
- 装饰模式,可以动态的添加修改类的功能
- 一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个之类继承它,并重新实现类的方法
使用装饰模式,仅需在运行时添加一个装饰对象即可实现,可以实现最大的灵活性
实现(例子)
定义一个装饰器接口,定义要实现的方法
- 创建一个对象实现装饰器的接口
- 在指定类中使用装饰器 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869//定义装饰器接口interface DrawDecorator{function beforeDraw();function afterDraw();}//创建装饰器,实现装饰器接口class ColorDrawDecorator implements DrawDecorator{protected $color;function __construct($color = 'red'){$this->color = $color;}function beforeDraw(){echo "<div style='color: {$this->color};'>";}function afterDraw(){echo "</div>";}}//使用装饰器class Canvas{protected $decorators = array();//添加装饰器function addDecorator(DrawDecorator $decorator){$this->decorators[] = $decorator;}//调用方法之前先调用装饰器的方法function beforeDraw(){foreach($this->decorators as $decorator){$decorator->beforeDraw();}}// 调用方法之后调用装饰器的方法function afterDraw(){// 倒序一下数组,保持好顺序$decorators = array_reverse($this->decorators);foreach($decorators as $decorator){$decorator->afterDraw();}}//此方法使用装饰器的方法function draw(){// 执行自己代码之前调用$this->beforeDraw();foreach($this->data as $line){foreach($line as $char){echo $char;}echo "<br />\n";}// 执行自己代码之后调用$this->afterDraw();}}
观察者模式
解耦利器。就是一个事件机制,我(们)先告诉你我(们)关注这件事(注册),如果这件事发生了改变(触发),通知我,我再执行我的逻辑
前言
- 观察者模式(Observer),当一个对象状态发生改变时,依赖他的对象全部会受到通知,并自动更新
- 场景:一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代码之后直接加入处理逻辑
当更新的逻辑增多之后,代码会变的难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码 - 观察者模式实现了低耦合,非侵入式的通知与更新机制
实现(例子)
|
|
总结
和yii框架提供的事件机制原理一样
适配器模式
多个相同功能目的的类,通过相同的方法来实现相同的功能目的
前言
适配器就是为了解决兼容,或者说是为了统一接口。比较常见的是数据库的适配,因为不同的数据库提供的接口(如:增删改)是不太一样的(或者是对同样的数据库有不同的操作接口,如mysql、mysqli,pdo3),这时候为了操作的方便,我们是需要用统一的方法对不同的数据库接口进行封装。还有比较常见的是对支付方式(微信、支付宝等)的封装。类似的场景还有cache缓存适配器,将memcache、redis、file等不同的缓存方式封装成相同的操作方法
实现(例子)
- 定义一个定义了约定要实现的方法的接口
- 不同的类实现这个接口,来各自完成自己的实现相应方法的逻辑
|
|
总结
使对不同类型的操作变的相当方便,不用花费太多的时间来记录不同类型的不同方法。不需要关注太多细节,操作mysql和操作mongo的方法变的基本一致,方便。
策略模式
前言
策略模式定义了一族相同类型的算法,算法之间独立封装,并且可以互换代替。
这些算法是同一类型问题的多种处理方式,他们具体行为有差别。
每一个算法、或说每一种处理方式称为一个策略。
在应用中,就可以根据环境的不同,选择不同的策略来处理问题。
实现(例子)
实现和适配器模式相似:
- 定义一个定义了约定要实现的方法的接口
- 不同的策略类实现这个接口,来各自完成自己的实现相应方法的逻辑
以数组输出为例。
数组的输出有序列化输出、JSON字符串输出和数组格式输出等方式。
每种输出方式都可以独立封装起来,作为一个策略。
应用时,如要把数组保存到数据库中,可以用序列化方式输出。
要提供给APP作接口,可以用JSON字符串输出。
其他程序调用,则直接输出数组格式。
总结
注册树模式
把创建的对象存放在一个对象中,将来访问的时候直接从这个对象中获取
前言
创建一个注册器类,将创建的对象绑定到注册树上,之后可以在全局通过注册树类进行访问绑定过的对象
其实可以实现单利模式的目的,即创建一次,全局使用;
实现(例子)
|
|
参考
歪麦博客(UML类图的使用,php设计模式)
慕课网-php设计模式
设计模式