PHP設計模式之裝飾模式

來源:互聯網
上載者:User

標籤:物件導向   extend   項目   protect   封裝   res   活性   適配器   適配器模式   

<?PHP//裝飾模式定義:在不必改變原類檔案和使用繼承的情況下,動態地擴充一個對象的功能。它是通過建立一個封裝對象,也就是裝飾來包裹真實的對象。//裝飾模式的特點:// (1) 裝飾對象和真實對象有相同的介面。這樣用戶端對象就能以和真實對象相同的方式和裝飾對象互動。// (2) 裝飾對象包含一個真實對象的引用(reference)// (3) 裝飾對象接受所有來自用戶端的請求。它把這些請求轉寄給真實的對象。// (4) 裝飾對象可以在轉寄這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在物件導向的設計中,通常是通過繼承來實現對給定類的功能擴充。//適用性:// 以下情況使用Decorator模式// 1. 需要擴充一個類的功能,或給一個類添加附加職責。// 2. 需要動態給一個對象添加功能,這些功能可以再動態撤銷。// 3. 需要增加由一些準系統的排列組合而產生的非常大量的功能,從而使繼承關係變的不現實。// 4. 當不能採用產生子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充,為支援每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於產生子類。// 優點:// 1. Decorator模式與繼承關係的目的都是要擴充項物件的功能,但是Decorator可以提供比繼承更多的靈活性。// 2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。// 缺點:// 1. 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。// 2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。// 3. 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component介面,增加新的公開的行為,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇。// 設計原則:// 1. 多用組合,少用繼承。// 利用繼承設計子類的行為,是在編譯時間靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充項物件的行為,就可以在運行時動態地進行擴充。// 2. 類應設計的對擴充開放,對修改關閉。// 裝飾者與適配者模式的區別編輯// 1.關於新職責:適配器也可以在轉換時增加新的職責,但主要目的不在此。裝飾者模式主要是給被裝飾者增加新職責的。// 2.關於原介面:適配器模式是用新介面來調用原介面,原介面對新系統是不可見或者說停用。裝飾者模式原封不動的使用原介面,系統對裝飾的對象也通過原介面來完成使用。(增加新介面的裝飾者模式可以認為是其變種--“半透明”裝飾者)// 3.關於其包裹的對象:適配器是知道被適配者的詳細情況的(就是那個類或那個介面)。裝飾者只知道其介面是什麼,至於其具體類型(是基類還是其他衍生類別)只有在運行期間才知道。[1] /** * 裝扮抽象類別 裝扮子類繼承實現打扮方法 */abstract class Decorate{//定義被裝扮人對象引用protected $presonObj;public function __construct($presonObj){$this->presonObj = $presonObj;}//強制子類實現打扮方法abstract public function dress();}/** * 裝扮類1 */class Decorate1 extends Decorate{public function dress(){echo "我是裝扮方法1".PHP_EOL;$this->presonObj->dress();}}/** * 裝扮類2 */class Decorate2 extends Decorate{public function dress(){echo "我是裝扮方法2".PHP_EOL;$this->presonObj->dress();}}/** * 裝扮類3 */class Decorate3 extends Decorate{public function dress(){echo "我是裝扮方法3".PHP_EOL;$this->presonObj->dress();}}/** * 被裝扮類 */class Presona {private $name;public function __construct($name){$this->name = $name;}public function dress(){echo "我的名字:".$this->name."裝扮完畢".PHP_EOL;}}//用戶端調用,注意:這裡是累計調用,以棧的形式,先進後出$presona = new Presona("小菜");$presona = new Decorate3($presona);$presona = new Decorate2($presona);$presona = new Decorate1($presona);$presona->dress();

  

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.