适配器模式(Adapter):结合两个不兼容的接口。GoF定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
<?php class message{ public function send(){ echo 'fa xiao ix'; } public function push(){ echo 'tui xiao xi'; } } class jiguang{ public function sendMsg(){ echo 'ji guang'; } public function pushMsg(){ echo 'jiguang push'; } } class jiguangAdpter extends message{ public $message; public function __construct() { $this->message = new jiguang; } public function send(){ $this->message->sendMsg(); } public function pushMsg(){ $this->message->pushMsg(); } } $jiguangAd = new jiguangAdpter(); $jiguangAd->send();
桥接模式(Bridge):通过封装一个抽象的接口,使得实现和抽象可以独立变化。GoF定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
在程序世界中,其实就是组合/聚合的代名词。为什么这么说呢?熟悉面向对象的我们都知道继承的好处,子类可以共享父类的很多属性、功能。但是,继承也会带来一个问题,那就是严重的耦合性。父类的修改多少都会对子类产生影响,甚至一个方法或属性的修改都有可能让所有子类都去修改一遍。这样就违背了开放封装原则。而桥接就是为了解决这个问题,它强调的是用组合/聚合的方式来共享一些能用的方法。相信大家一定想到了php中的trait,如果你在工作中使用过这个特性,那么你就已经用过桥接模式了!
<?php //桥接模式 interface MessageTemplate { public function GetTemplate(); } class LoginMessage implements MessageTemplate{ public function GetTemplate() { echo 'denglu duanxin'; } } class RegMessage implements MessageTemplate{ public function GetTemplate(){ echo 'zhuce duanxin'; } } abstract class MessageService{ public $template; public function __construct($template){ $this->template = $template; } // abstract public function send(); } class AliService extends MessageService{ public function Send() { $this->template->GetTemplate(); } } $login = new LoginMessage(); $reg = new RegMessage(); $al = new AliService($login); $al->send();
组合模式(Composite):创建对象组的树形结构,使得单个对象和组合对象具有一致性。
装饰器模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。
外观模式(Facade):为复杂的模块或子系统提供可以访问的接口,并且隐藏了内部的复杂性。
享元模式(Flyweight):通过共享技术有效地支持大量细粒度的对象。
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。