PHP物件導向進階設計模式:委託模式使用實例
物件導向程式設計的最強大功能之一是其擁有動態特性。當今世界不斷湧現出更多可用的功能、混合搭建結構以及持續發展的標準,動態程式碼具有了全新的意義。無論是新檔案儲存標準或串流標準,或是社群網站或某些有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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP中OOP最佳實務包括命名約定、介面與抽象類別、繼承與多型、依賴注入。實戰案例包括:使用倉庫模式管理數據,使用策略模式實現排序。

在Java框架中,設計模式和架構模式的區別在於:設計模式定義了在軟體設計中解決常見問題的抽象解決方案,專注於類別和物件之間的交互,例如工廠模式。架構模式定義了系統結構和模組之間的關係,關注系統元件的組織和交互,如分層架構。

透過掌握追蹤物件狀態、設定斷點、追蹤異常和利用xdebug擴展,可以有效調試PHP物件導向程式碼。 1.追蹤物件狀態:使用var_dump()和print_r()檢視物件屬性和方法值。 2.設定斷點:在開發環境中設定斷點,偵錯器會在執行到達斷點時暫停,以便檢查物件狀態。 3.追蹤異常:使用try-catch區塊和getTraceAsString()取得異常發生時的堆疊追蹤和訊息。 4.利用偵錯器:xdebug_var_dump()函數可在程式碼執行過程中檢查變數的內容。

裝飾器模式是一種結構型設計模式,允許動態添加物件功能,無需修改原始類別。它透過抽象組件、具體組件、抽象裝飾器和具體裝飾器的協作實現,可以靈活擴展類別功能,滿足變化的需求。範例中,將牛奶和摩卡裝飾器添加到Espresso,總價為2.29美元,展示了裝飾器模式在動態修改物件行為方面的強大功能。

TDD用於編寫高品質PHP程式碼,步驟包括:編寫測試案例,描述預期功能並使其失敗。編寫程式碼,僅使測試案例通過,無需過度優化或詳細設計。測試案例通過後,優化和重構程式碼以提高可讀性、可維護性和可擴展性。

適配器模式是一種結構型設計模式,允許不相容物件協同工作,它將一個介面轉換為另一個,使物件能夠順利互動。物件適配器透過建立包含被適配器對象的適配器對象,並實現目標接口,實現適配器模式。在一個實戰案例中,透過適配器模式,客戶端(如MediaPlayer)可以播放高級格式的媒體(如VLC),儘管本身僅支援普通媒體格式(如MP3)。

Guice框架應用了多項設計模式,包括:單例模式:透過@Singleton註解確保類別只有一個實例。工廠方法模式:透過@Provides註解建立工廠方法,在依賴注入時取得物件實例。策略模式:將演算法封裝成不同策略類,透過@Named註解指定具體策略。

Java框架中使用設計模式的優點包括:程式碼可讀性、可維護性和可擴充性增強。缺點包括:過度使用導致複雜性、效能開銷以及學習曲線陡峭。實戰案例:代理模式用於延遲載入物件。明智地使用設計模式可充分利用其優勢並最小化缺點。
