物件導向程式設計的最強大功能之一是其擁有動態特性。當今世界不斷湧現出更多可用的功能、混合搭建結構以及持續發展的標準,動態程式碼具有了全新的意義。無論是新檔案儲存標準或串流標準,或是社群網站或某些有Internet先鋒API上的新事物,Web程式設計總是不斷地發生突變。如今在面對大量的可用選項時,處理判決的傳統方式不再有效。透過將智慧化物件移動到適當的位置,委託設計模式能夠遠離複雜的判決。
什麼是委託模式?
透過分配或委託至其他對象,委託設計模式能夠去除核心對像中的判決和複雜的功能性。
委託模式應用問題與解決方案
大多數PHP程式設計師最初接觸的幾乎都是程式化的程式設計類型。這種程式樣式極大地依賴以條件語句為基礎的流控制。物件導向的程式設計提供了某些不同於傳統條件語句的手段,從而創造了更多態的程式碼流。這個功能的實作方法之一是建立基於委託設計模式的物件。
委託設計模式致力於從核心物件中去除複雜性。此時我們並非設計極大依賴於透過評估條件語句而執行特定功能性的對象,基於委託模式的對象能夠將判決委託給不同的對象。委託既可以像使用中間物件處理判決樹一樣簡單,也可以像使用動態實例化物件提供期望的功能一樣複雜。
不要將委託設計模式視為條件語句的直接競爭者,這是非常重要的。相反,委託設計模式透過不需要條件語句就可以呼叫正確功能性的方式來幫助構成體系結構。條件語句最好駐留在實際方法中,並且在方法中完成業務規則的處理。
委託設計模式的一個使用範例是為特定資料部分提供多種格式。假設在開放資源程式碼庫中存在一個歸檔。當訪客打算下載部分原始碼時,他們可以選擇兩種不同格式的檔案。指定檔案被壓縮後將被傳送至瀏覽器。在這個範例中,我打算採用zip和tgz壓縮格式的檔案。
當一個物件包含複雜但獨立的、必須基於判決執行的功能性的若干部分時,最佳的做法是使用基於委託設計模式的物件。
UML
#這個UML圖詳細說明了一個使用委託設計模式的類別設計。
以下是上圖的說明:
#1.基底類別MyObject知道會使用基於委託設計模式的物件。這個類別包含私有字元字串delegateType以及MyDelegateObject的私有實例internalDelegate。
2.setDelegateType()方法接收一個名為type的參數,這個參數被儲存在delegateType字串中。
3.createDelegateObject()方法會建立委託物件的一個實例,並且根據delegateType變數為實例命名。隨後,透過將該實例指派給internalDelegate,這個方法講其儲存在內部。
4.runDelegateAction()方法負責執行internalDelegate物件的action()方法。
5.MyDelegateObject包含負責特定動作的邏輯。 MyObject運行action()方法實作具體的功能。
應用場景
設計了一個cd類,類別中有mp3播放模式,和mp4播放模式
改進前,使用cd類的播放模式,需要在實例化的類別中去判斷選擇什麼方式的播放模式
改進後,播放模式當做一個參數傳入playList函數中,就自動能找到對應需要播放的方法。
程式碼:cd類,未改進之前,選擇播放模式是一種痛苦的事情
使用實例:
<?php //委托模式-去除核心对象中的判决和复杂的功能性 //使用委托模式之前,调用cd类,选择cd播放模式是复杂的选择过程 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(); }
程式碼:透過委託模式,改進後的cd類別
<?php //委托模式-去除核心对象中的判决和复杂的功能性 //改进cd类 class cdDelegate { protected $cdInfo = array(); public function addSong($song) { $this->cdInfo[$song] = $song; } public function play($type, $song) { $obj = new $type; return $obj->playList($this->cdInfo, $song); } } class mp3 { public function playList($list) { return $list[$song]; } } class mp4 { public function playList($list) { return $list[$song]; } } $newCd = new cd; $newCd->addSong("1"); $newCd->addSong("2"); $newCd->addSong("3"); $type = 'mp3'; $oldCd->play('mp3', '1'); //只要传递参数就能知道需要选择何种播放模式
以上是PHP物件導向進階設計模式:委託模式使用實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!