PHP常用設(shè)計(jì)模式之委托設(shè)計(jì)模式
模式定義
委托是對(duì)一個(gè)類的功能進(jìn)行擴(kuò)展和復(fù)用的方法。它的做法是:寫(xiě)一個(gè)附加的類提供附加的功能,并使用原來(lái)的類的實(shí)例提供原有的功能。
假設(shè)我們有一個(gè) TeamLead 類,將其既定任務(wù)委托給一個(gè)關(guān)聯(lián)輔助對(duì)象 JuniorDeveloper 來(lái)完成:本來(lái) TeamLead 處理 writeCode 方法,Usage 調(diào)用 TeamLead 的該方法,但現(xiàn)在 TeamLead 將 writeCode 的實(shí)現(xiàn)委托給 JuniorDeveloper 的 writeBadCode 來(lái)實(shí)現(xiàn),但 Usage 并沒(méi)有感知在執(zhí)行 writeBadCode 方法。
設(shè)計(jì)了一個(gè)cd類,類中有mp3播放模式,和mp4播放模式
改進(jìn)前,使用cd類的播放模式,需要在實(shí)例化的類中去判斷選擇什么方式的播放模式
改進(jìn)后,播放模式當(dāng)做一個(gè)參數(shù)傳入playList函數(shù)中,就自動(dòng)能找到對(duì)應(yīng)需要播放的方法。
一,未改進(jìn)前
<?php //使用委托模式之前,調(diào)用cd類,選擇cd播放模式是復(fù)雜的選擇過(guò)程 class cd { protected $cdInfo = array(); public function addSong($song) { $this->cdInfo[$song] = $song; } public function playMp3($song) { return $this->cdInfo[$song] . '.mp3'; } public function playMp4($song) { return $this->cdInfo[$song] . '.mp4'; } } $oldCd = new cd; $oldCd->addSong("1"); $oldCd->addSong("2"); $oldCd->addSong("3"); $type = 'mp3'; if ($type == 'mp3') { $oldCd->playMp3(); } else { $oldCd->playMp4(); }
二、通過(guò)委托模式,改進(jìn)后的cd類
<?php namespace Tools; /* 委托模式 去除核心對(duì)象中的判決和復(fù)雜功能性 */ //委托接口 interface Delegate{ public function playList($list,$song); } //mp3處理類 class mp3 implements Delegate{ public function playList($list,$song){ return $list[$song].'.mp3'; } } //mp4處理類 class mp4 implements Delegate{ public function playList($list, $song) { return $list[$song].'.mp4'; } } class cdDelegate{ protected $cdInfo = array(); public function addSong($song){ $this->cdInfo[$song] = $song; } public function play($type,$song){ $name = '\Tools\\'.$type; $obj = new $name; return $obj->playList($this->cdInfo,$song); } } $newCd = new cdDelegate(); $newCd->addSong("1"); $newCd->addSong("2"); $newCd->addSong("3"); echo $newCd->play('mp3','1');//只要傳遞參數(shù)就能知道需要選擇何種播放模式
以上內(nèi)容給大家介紹了PHP委托設(shè)計(jì)模式實(shí)例詳解,希望對(duì)大家有所幫助。
相關(guān)文章
PHP實(shí)現(xiàn)簡(jiǎn)單爬蟲(chóng)的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)簡(jiǎn)單爬蟲(chóng)的方法,涉及php頁(yè)面抓取及分析的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07使用GDB調(diào)試PHP代碼,解決PHP代碼死循環(huán)問(wèn)題
這篇文章主要介紹了使用GDB調(diào)試PHP代碼,解決PHP代碼死循環(huán)問(wèn)題,需要的朋友可以參考下2015-03-03帖幾個(gè)PHP的無(wú)限分類實(shí)現(xiàn)想法~
帖幾個(gè)PHP的無(wú)限分類實(shí)現(xiàn)想法~...2007-01-01利用ThinkPHP內(nèi)置的ThinkAjax實(shí)現(xiàn)異步傳輸技術(shù)的實(shí)現(xiàn)方法
ThinkPHP的官方文檔沒(méi)有給出ThinkAjax的使用方法,令很多初學(xué)者使用起來(lái)有些不便,今天學(xué)到這里,也碰到了很多問(wèn)題,花時(shí)間深究下,做個(gè)學(xué)習(xí)筆記,希望能對(duì)初學(xué)者有幫助2011-12-12Nginx環(huán)境下PHP flush失效的解決方法
最近在工作中發(fā)現(xiàn)了一個(gè)問(wèn)題,PHP的flush居然失效了,從網(wǎng)上找了一些資料,發(fā)現(xiàn)是Nginx的原因,所以這篇文章就給大家介紹了問(wèn)題與解決辦法,有需要的朋友們下面來(lái)一起看看吧。2016-10-10PHP 優(yōu)化配置——加速你的VBB,phpwind,Discuz,IPB,MolyX
PHP 優(yōu)化配置——加速你的VBB,phpwind,Discuz,IPB,MolyX...2007-07-07flash+php+mysql打造簡(jiǎn)單留言本教程
剛開(kāi)始做這個(gè)留言本的時(shí)候,連mysql和php都沒(méi)接觸過(guò)。經(jīng)過(guò)痛苦的查找資料和學(xué)習(xí),郁悶了一個(gè)星期后完成了我的簡(jiǎn)單留言本2008-07-07php 多個(gè)變量指向同一個(gè)引用($b = &$a)用法分析
這篇文章主要介紹了php 多個(gè)變量指向同一個(gè)引用($b = &$a)用法,結(jié)合實(shí)例形式分析了PHP變量引用原理、優(yōu)缺點(diǎn)及相關(guān)操作技巧,需要的朋友可以參考下2019-11-11