標籤:self 適配器模式 array else null cost extend ora tde
一、原廠模式:減少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());
PHP設計模式筆記