php 設計模式備忘

來源:互聯網
上載者:User

標籤:設計模式 五個 php

  1. 單例模式用於:

        不重複建立對象,節省記憶體。(PHP很容易卡死的,比如說遞迴20,30 層)比如用於資料庫連接對象

class Single {    private $name;//聲明一個私人的執行個體變數    private function __construct(){//聲明私人構造方法為了防止外部代碼使用new來建立對象。        }    static public $instance;//聲明一個靜態變數(儲存在類中唯一的一個執行個體)    static public function getinstance(){//聲明一個getinstance()靜態方法,用於檢測是否有執行個體對象        if(!self::$instance) self::$instance = new self();        return self::$instance;    }    public function setname($n){ $this->name = $n; }    public function getname(){ return $this->name; }}

2.原廠模式用於:

        應該TP裡面的M方法建立迷行應該就是這樣,感覺和單例還是很像的。

        原廠模式就是一種類,具有為您建立對象的某些方法,這樣就可以使用工廠類建立對象,而不直接使用new。這樣如果想更改建立的物件類型,只需更改該工廠即可。

 class Factory {//建立一個基本的工廠類      static public function fac($id){//建立一個返回對象執行個體的靜態方法          if(1 == $id) return new A();          elseif(2==$id) return new B();         elseif(3==$id) return new C();          return new D();  }  }

3.觀察者模式:

        針對一個博主,這是一個介面或者對象,裡面可以註冊觀察者(粉絲),然後遍曆粉絲,對每個人執行一個方法。例如這個樣子:

<?php//主題class Paper{private $_observers = array();//注冊觀察者,誰依賴我,誰是我的粉絲,我有動態,依次推送,都在觀察關注我public function register($sub){$this->_observers[] = $sub; }//外部統一訪問public function trigger(){if(!empty($this->_observers)){foreach($this->_observers as $observer){$observer->update();//統一的方法,依次進行各個觀察者}}}}//觀察者實現介面interface Observerable{public function update();}class Subscriber implements Observerable{public function update(){echo "Callback\n";}}$paper = new Paper();$paper->register(new Subscriber());$paper->trigger();

4.策略模式

針對同一個行為,你有不同的方案,就可以寫成策略,就是一個大的演算法集合。再比如你定價有不同的活動,滿200-10,滿400-100等,都是一個小演算法,集合成策略

<?phpinterface FlyBehavior{//策略介面public function fly();}class FlyWithWings implements FlyBehavior{//c策略1public function fly(){echo "Fly with Wings";}}class FlyWithNo implements FlyBehavior{//c策略2public function fly(){echo "Fly with No Wings";}}class Duck{private $_flyBehavior;public function performFly(){$this->_flyBehavior->fly();}//這裡引進來策略,可以切換不同的策略public function setFlyBehavior(FlyBehavior $behavior){$this->_flyBehavior = $behavior;}}class RubberDuck extends Duck{}$duck = new RubberDuck();$duck->setFlyBehavior(new FlyWithWings());$duck->performFly();$duck->setFlyBehavior(new FlyWithWings());$duck->performFly();

5.裝飾者模式

就是給被裝飾者增加屬性的,之後你就可以取代被裝飾者。其實一個明顯的例子就是穿衣服的順序和方案。因為你有很多的方案可以動態加進去。這樣的話比產生子類好很多,就不用把每個方案都建立對象,然後執行方法。

不恰當的樣本如下:

$a = new a(new person());

$a.show();

$b=new b(new person());

$b.show();

$c = new c(new person());

$c.show();

改進的方案如下:首先把a,b,c 寫一個抽象的介面統一起來,然後在面對被裝飾者person()

<?php//抽象類別不能執行個體化abstract class Beverage{public $_name;//品類名abstract public function Cost();//費用}//被裝飾者,都是給coffee加東西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;}}class Milk extends CondimentDecorator{public $_beverage;//被裝飾者public function __construct($beverage){$this->_name = ‘Milk‘;//該品種名if($beverage instanceof Beverage){$this->_beverage = $beverage;}else{exit(‘Failure‘);}}public function Cost(){return $this->_beverage->Cost()+0.2;//底價加上新加的東西}}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;//底價加上新加的東西}}//拿杯咖啡$coffee = new Coffee();//加點牛奶$coffee = new Milk($coffee);//加點糖$coffee = new Sugar($coffee);echo "Coffee現在的總價格是".$coffee->Cost();//總結://1.裝飾者和被裝飾者必須是同一類型,因為裝飾者可以取代它//2.當裝飾者和組件組合的時候,就是在加入新的行為


本文出自 “一站式解決方案” 部落格,請務必保留此出處http://10725691.blog.51cto.com/10715691/1954572

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.