適配器模式屬於結構型模式
概述:將一個類的介面轉換成客戶希望的另外一個介面。Adapter 模式使得原本的由於介面不相容而不能一起工作的那些類可以一起工作
使用前提:
適配器中主要角色
目標(Target)角色:定義用戶端使用的與特定領域相關的介面,這也就是我們所希望得到的
源(Adaptee)角色:需要進行適配的介面
適配器(Adapter)角色:対Adaptee的介面與Target的介面進行適配;適配器是本模式的核心,適配器把源介面轉換成目標介面,此角色為具體類
適配器使用情境
1、你想使用一個已經存在的類,而它的介面不符合你的需求
2、你想建立一個可以複用的類,該類可以與其他不相關的類或不可預見的類協同工作
3、你想使用一個已經存在的子類,但是不可能對每一個都進行子類化以匹配他們的介面,對象適配器可以適配他的父類介面(僅限於對象適配器)
個人舉例:
1 姚明在NBA打球,但是不懂英語,需要一個翻譯進行翻譯之後才能懂得戰術
2 蘋果手機使用安卓手機的充電線
namespace haibao\design\web\view\design;
use haibao\design\web\common\design\adapter\Forwards;
use haibao\design\web\common\design\adapter\Center;
use haibao\design\web\common\design\adapter\Translator;
class Adapter extends \haibao\design\web\view\Base{
protected function preRender(){
header("Content-type: text/html; charset=utf-8");
$forwards = new Forwards('科比');
$forwards->attack();
$forwards->defense();
echo "
";
$center = new Center('霍華德');
$center->attack();
$center->defense();
echo "
";
$translator = new Translator('姚明');
$translator->attack();
$translator->defense();
echo "
";
}
}
/**
* 中鋒
*/
namespace haibao\design\web\common\design\adapter;
class Center extends Player{
public function __construct($name){
parent::__construct($name);
}
public function attack(){
echo '中鋒'.$this->name.'進攻
';
}
public function defense(){
echo '中鋒'.$this->name.'防守
';
}
}
/**
* 外籍前鋒
*/
namespace haibao\design\web\common\design\adapter;
class ForeignCenter{
private $name;
public function __construct($name){
$this->name = $name;
}
public function chinaattack(){
echo '外籍前鋒'.$this->name.'進攻
';
}
public function chinadefense(){
echo '外籍前鋒'.$this->name.'防守
';
}
}
/**
* 前鋒
*/
namespace haibao\design\web\common\design\adapter;
class Forwards extends Player{
public function __construct($name){
parent::__construct($name);
}
public function attack(){
echo '前鋒'.$this->name.'進攻
';
}
public function defense(){
echo '前鋒'.$this->name.'防守
';
}
}
/**
* 球員
*/
namespace haibao\design\web\common\design\adapter;
abstract class Player{
public $name;
public function __construct($name){
$this->name = $name;
}
public function attack(){
}
public function defense(){
}
}
/**
* 外籍中鋒翻譯員
*/
namespace haibao\design\web\common\design\adapter;
class Translator extends Player{
public $foreignCenter;
public function __construct($name){
$this->foreignCenter = new ForeignCenter($name);
}
public function attack(){
$this->foreignCenter->chinaattack();
}
public function defense(){
$this->foreignCenter->chinadefense();
}
}