適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口適配成用戶所期待的(適配器模式要解決的核心問題)。一個適配允許通常因為接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。
類圖:
待適配(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
適用場景
1.接口中規定了所有要實現的方法
2.但要有一個實現此接口的具體類,只用到了其中的幾個方法,而其它的方法都是沒有用的。
注意事項
1.充當適配器角色的類就是實現已有接口的抽象類
2.為什麼要用抽象類:
此類是不要被實例化的。而只充當適配器的角色,也就為其子類提供了一個共同的接口,但其子類又可以將精力只集中在其感興趣的地方。