PHP設(shè)計(jì)模式之裝飾器模式實(shí)例詳解
本文實(shí)例講述了PHP設(shè)計(jì)模式之裝飾器模式。分享給大家供大家參考,具體如下:
裝飾器模式又叫裝飾者模式。裝飾模式是在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的對(duì)象。
UML類圖:
角色:
組件對(duì)象的接口:可以給這些對(duì)象動(dòng)態(tài)的添加職責(zé)
所有裝飾器的父類:需要定義一個(gè)與組件接口一致的接口,并持有一個(gè)Component對(duì)象,該對(duì)象其實(shí)就是被裝飾的對(duì)象。
具體的裝飾器類:實(shí)現(xiàn)具體要向被裝飾對(duì)象添加的功能。用來裝飾具體的組件對(duì)象或者另外一個(gè)具體的裝飾器對(duì)象。
具體代碼:
<?php /** * Created by PhpStorm. * User: Jiang * Date: 2015/5/3 * Time: 11:11 */ /**組件對(duì)象接口 * Interface IComponent */ interface IComponent { function Display(); } /**待裝飾對(duì)象 * Class Person */ class Person implements IComponent { private $name; function __construct($name) { $this->name=$name; } function Display() { echo "裝扮的:{$this->name}<br/>"; } } /**所有裝飾器父類 * Class Clothes */ class Clothes implements IComponent { protected $component; function Decorate(IComponent $component) { $this->component=$component; } function Display() { if(!empty($this->component)) { $this->component->Display(); } } } //------------------------------具體裝飾器---------------- class PiXie extends Clothes { function Display() { echo "皮鞋 "; parent::Display(); } } class QiuXie extends Clothes { function Display() { echo "球鞋 "; parent::Display(); } } class Tshirt extends Clothes { function Display() { echo "T恤 "; parent::Display(); } } class Waitao extends Clothes { function Display() { echo "外套 "; parent::Display(); } }
調(diào)用客戶端測(cè)試代碼:
header("Content-Type:text/html;charset=utf-8"); //------------------------裝飾器模式測(cè)試代碼------------------ require_once "./Decorator/Decorator.php"; $Yaoming=new Person("姚明"); $aTai=new Person("A泰斯特"); $pixie=new PiXie(); $waitao=new Waitao(); $pixie->Decorate($Yaoming); $waitao->Decorate($pixie); $waitao->Display(); echo "<hr/>"; $qiuxie=new QiuXie(); $tshirt=new Tshirt(); $qiuxie->Decorate($aTai); $tshirt->Decorate($qiuxie); $tshirt->Display();
適用場(chǎng)景:
1. 需要?jiǎng)討B(tài)的給一個(gè)對(duì)象添加功能,這些功能可以再動(dòng)態(tài)的撤銷。
2. 需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變的不現(xiàn)實(shí)。
3. 當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP基本語(yǔ)法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP 函數(shù)call_user_func和call_user_func_array用法詳解
下面來和大家分享一下這個(gè)call_user_func_array和call_user_func函數(shù)的用法,另外附贈(zèng)func_get_args()函數(shù)和func_num_args()函數(shù),嘿嘿!!2014-03-03php實(shí)現(xiàn)session自定義會(huì)話處理器的方法
這篇文章主要介紹了php實(shí)現(xiàn)session自定義會(huì)話處理器的方法,可通過設(shè)置session.save_handler為user來調(diào)用自定義的回調(diào)函數(shù),從而實(shí)現(xiàn)session自定義會(huì)話處理器的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-01-019個(gè)PHP開發(fā)常用功能函數(shù)小結(jié)
9個(gè)PHP開發(fā)常用功能函數(shù)小結(jié),學(xué)習(xí)php的朋友可以參考下。2011-07-07PHP file_get_contents 函數(shù)超時(shí)的幾種解決方法
在使用file_get_contents函數(shù)的時(shí)候,經(jīng)常會(huì)出現(xiàn)超時(shí)的情況,在這里要通過查看一下錯(cuò)誤提示,看看是哪種錯(cuò)誤,比較常見的是讀取超時(shí),這種情況大家可以通過一些方法來盡量的避免或者解決。2009-07-07php驗(yàn)證碼的制作思路和實(shí)現(xiàn)方法
這篇文章主要介紹了php驗(yàn)證碼的制作思路和實(shí)現(xiàn)方法,我們不能盲目的去實(shí)現(xiàn)php生成驗(yàn)證碼,更應(yīng)該了解php驗(yàn)證碼的基本原理,真正的掌握php驗(yàn)證碼的實(shí)現(xiàn)方法,需要的朋友可以參考下2015-11-11PHP編程獲取圖片的主色調(diào)的方法【基于Imagick擴(kuò)展】
這篇文章主要介紹了PHP編程獲取圖片的主色調(diào)的方法,基于PHP的Imagick擴(kuò)展實(shí)現(xiàn)針對(duì)圖片的顏色值獲取功能,需要的朋友可以參考下2017-08-08