聲明:本系列部落格參考資料《大話設計模式》,作者程傑。
適配器模式(有時候也稱封裝樣式或者封裝)將一個類的介面適配成使用者所期待的(適配器模式要解決的核心問題)。一個適配允許通常因為介面不相容而不能在一起工作的類工作在一起,做法是將類自己的介面包裹在一個已存在的類中。
類圖:
待適配(ForeignPlayer)角色:此角色的介面規則內部的介面規則不一致,但內部需要調用該角色的方法功能。
內部介面(IPlayer)角色:這是一個抽象角色,此角色給出內部期待的介面規則。
適配器(Adapter)角色:通過在內部封裝一個Adapter對象,把待適配介面轉換成目標介面,此角色為適配器模式的核心角色,也是適配器模式所解決問題的關鍵。
代碼:
"; } function Defense() { echo "前鋒防禦
"; }}/**中鋒 * Class Center */class Center implements IPlayer{ function Attack() { echo "中鋒攻擊
"; } function Defense() { echo "中鋒防禦
"; }}//--------------待適配對象-----------/**姚明 外籍運動員 * Class Yaoming */class Yaoming{ function 進攻() { echo "姚明進攻
"; } function 防禦() { echo "姚明防禦
"; }}//------------適配器--------------/**適配器 * Class Adapter */class Adapter implements IPlayer{ private $_player; function __construct() { $this->_player=new Yaoming(); } function Attack() { $this->_player->進攻(); } function Defense() { $this->_player->防禦(); }}
用戶端測試代碼:
header("Content-Type:text/html;charset=utf-8");//------------------------原型模式測試代碼------------------require_once "./Adapter/Adapter.php";$player1=new Forward();echo "前鋒上場:
";$player1->Attack();$player1->Defense();echo "
";echo "姚明上場:
";$yaoming=new Adapter();$yaoming->Attack();$yaoming->Defense();
適用情境
1.介面中規定了所有要實現的方法
2.但要有一個實現此介面的具體類,只用到了其中的幾個方法,而其它的方法都是沒有用的。
注意事項
1.充當適配器角色的類就是實現已有介面的抽象類別
2.為什麼要用抽象類別:
此類是不要被執行個體化的。而只充當適配器的角色,也就為其子類提供了一個共同的介面,但其子類又可以將精力只集中在其感興趣的地方。