首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 常用設計模式:委派設計模式實例詳解與 CD 播放器重構

     編輯:PHP 綜合知識

模式定義

委派模式擴展類別功能的方法:編寫附加類別提供新功能,並使用原類別實例提供原有功能。

場景說明

TeamLead 將 writeCode 任務委派給 JuniorDeveloper 的 writeBadCode 實現,調用者 Usage 無感知。

CD 播放器重構完整代碼

重構前:客戶端包含判斷邏輯

class CD {
    protected $cdInfo = [];
    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(); }

重構後:委派模式封裝播放策略

namespace Tools;

// 委派介面
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 = [];
    public function addSong($song) { $this->cdInfo[$song] = $song; }
    public function play($type, $song) {
        $className = '\\Tools\\' . $type; // 直接使用型別名稱
        $strategy = new $className();
        return $strategy->playList($this->cdInfo, $song);
    }
}

$newCd = new CDDelegate();
$newCd->addSong("1"); $newCd->addSong("2"); $newCd->addSong("3");
echo $newCd->play('mp3', '1'); // 僅傳遞參數,自動路由到對應策略

核心改進點

方面重構前重構後
判斷邏輯位置客戶端代碼中委派類別內部 (工廠式建立策略)
新增播放格式修改 CD 類別 + 客戶端新增策略類別實現 Delegate 介面
開放封閉原則違反 (修改現有代碼)符合 (擴展新策略類別)
單一職責CD 類別兼管資料與播放邏輯CDDelegate 管資料,策略類別管播放
客戶端複雜度需知曉具體播放方法僅需傳遞型別參數

適用場景

  • 行為需動態切換 (播放格式、支付方式、日誌輸出目標)
  • 核心類別不應包含具體算法實現
  • 需支援第三方擴展新行為 (插件系統)
  • 測試時需替換實現 (Mock 策略)

注意事項

  1. 策略類別命名規範需與工廠邏輯對應 (如 Mp3, Mp4)
  2. 生產環境建議加入策略快取避免重複實例化
  3. 可結合依賴注入容器管理策略生命週期
  4. 介面設計應盡量精簡,避免「胖介面」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved