PHP設計模式筆記

來源:互聯網
上載者:User

標籤: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設計模式筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.