PHP设计模式笔记
一、工厂模式:减少new的使用,定义一个类,专门用来创建其它对象
例:
class A{ static function create(){ return new DB(); } } $db = A::create();
二、单例模式:确保一个类只有一个实例
使用场景:缓存、日志对象、数据库操作只有一个实例。
缺点:
1. 难于调试
2. 隐藏的依赖关系
例:
class A { //静态变量保存全局实例 private static $_init = null; //私有构造函数,防止外部实例化对象 private function __construct(){ } //私有克隆函数,防止外部克隆对象 private function __clone(){ } //静态方法,单例统一访问入口 public static function getInit(){ if (!isset(self::$_init)){ self::$_init = new self(); } return self::$_init; } public function test(){ echo '调用方法成功'; } } $a = A::getInit(); $a->test();
三、策略模式:把特定行为封装成类,适应特定的环境
使用场景:电商男装女装
例:
//抽象策略接口 interface A{ public function show(); } //用于客户端是IE时调用的类(环境角色) class IE implements A { public function show(){ return 'ie'; } } //用于客户端不是firefox时调用的类(环境角色) class FF implements A { public function show(){ return 'firefox'; } } //具体策略角色 class U { public function index($obj){ echo $obj->show(); } } $user = new U(); $user->index(new FF);
四、观察者模式:当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
使用场景:事件系统
缺点:性能降低
例:
//定义观察者接口 interface Looker { public function news($user);//定义接收通知的方法 } //定义被观察事件的接口 interface Event { public function add($obj);//定义被观察事件的方法 public function notify($user);//定义通知所有观察者的方法 } //被观察事件 class E1 implements Event { protected $obj = array(); public function add($obj){//被观察事件 $this->obj[] = $obj; } public function notify($user){//通知所有观察者 foreach($this->obj as $o){ $o->news($user); } } } //观察者 class L1 implements Looker { public function news($user){//接收通知 echo $user.'有新动态<br>'; } } $event1 = new E1; $event1->add(new L1); $event1->notify('小明'); $event1->notify('小红'); $event1->notify('小李');
五、适配器模式:把各种不同的类封装成同一接口
使用场景:数据库mysql,mysqli。缓存memcache,redis,file。可以用适配器模式统一成一致
六、装饰者模式:可以动态的添加修改类的功能
例:
abstract class Beverage{ public $_name; abstract public function Cost(); } //被装饰者类 class Coffee extends Beverage{ public function __construct(){ $this->_name = 'Coffee'; } public function Cost(){ return 1.00; } } // 以下三个类是装饰者相关类 class CondimentDecorator extends Beverage{ public function __construct(){ $this->_name = 'Condiment'; } public function Cost(){ return 0.1; } } //2.加点牛奶 class Milk extends CondimentDecorator{ public $_beverage; public function __construct($beverage){ $this->_name = 'Milk'; if($beverage instanceof Beverage){ $this->_beverage = $beverage; }else{ die('Failure'); } } public function Cost(){ return $this->_beverage->Cost() + 0.2; } } //3.加点糖 class Sugar extends CondimentDecorator{ public $_beverage; public function __construct($beverage){ $this->_name = 'Sugar'; if($beverage instanceof Beverage){ $this->_beverage = $beverage; }else{ exit('Failure'); } } public function Cost(){ return $this->_beverage->Cost() + 0.2; } } //1.拿杯咖啡 $coffee = new Coffee(); //2.加点牛奶 $coffee = new Milk($coffee); //3.加点糖 $coffee = new Sugar($coffee); printf("Coffee Total:%0.2f元\n",$coffee->Cost());
- 作者:成九
- 出处:https://luyucheng.cnblogs.com
- 若无特别说明均为原创作品,如需转载请注明原文链接
如果您觉得本文对您的学习有所帮助,可通过支付宝来打赏博主,增加博主的写作动力