【目的】:將一個類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原來由於接口不兼容而不能一起工作的那此類可以一起工作
【主要角色】
目標(Target)角色:定義客戶端使用的與特定領域相關的接口,這也就是我們所期待得到的
源(Adaptee)角色:需要進行適配的接口
適配器(Adapter)角色:對Adaptee的接口與Target接口進行適配;適配器是本模式的核心,適配器把源接口轉換成目標接口,此角色為具體類
【適用性】
1、你想使用一個已經存在的類,而它的接口不符合你的需求
2、你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類協同工作
3、你想使用一個已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口(僅限於對象適配器)
//目標角色
interface Target {
public function simpleMethod1();
public function simpleMethod2();
}
//源角色
class Adaptee {
public function simpleMethod1(){
echo 'Adapter simpleMethod1'."<br>";
}
}
//類適配器角色
class Adapter implements Target {
private $adaptee;
function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
//委派調用Adaptee的sampleMethod1方法
public function simpleMethod1(){
echo $this->adaptee->simpleMethod1();
}
public function simpleMethod2(){
echo 'Adapter simpleMethod2'."<br>";
}
}
//客戶端
class Client {
public static function main() {
$adaptee = new Adaptee();
$adapter = new Adapter($adaptee);
$adapter->simpleMethod1();
$adapter->simpleMethod2();
}
}
Client::main();
【運行結果】
Adapter simpleMethod1
Adapter simpleMethod2
例子2
生活中最常見到的足球換人機制
<?php
/**
* Created by PhpStorm.
*/
//-------------抽象接口---------------
/**抽象運動員
* Interface IPlayer
*/
interface SoccerPlayer
{
function Attack();
function Defense();
}
/**前鋒
* Class Forward
*/
class Forward implements SoccerPlayer
{
function Attack()
{
echo "前鋒攻擊<br/>";
}
function Defense()
{
echo "前鋒防御<br/>";
}
}
/**中鋒
* Class Center
*/
class Center implements SoccerPlayer
{
function Attack()
{
echo "中鋒攻擊<br/>";
}
function Defense()
{
echo "中鋒防御<br/>";
}
}
//--------------待適配對象-----------
/**梅西 剛進入罷賽的運動員
* Class Yaoming
*/
class Messi
{
function 進攻()
{
echo "梅西進攻<br/>";
}
function 防御()
{
echo "梅西防御<br/>";
}
}
//------------適配器--------------
/**適配器
* Class Adapter
*/
class Adapter implements SoccerPlayer
{
private $_player;
function __construct()
{
$this->_player=new Messi();
}
function Attack()
{
$this->_player->進攻();
}
function Defense()
{
$this->_player->防御();
}
}
測試如下
$player1=new Forward();
echo "前鋒上場:<br/>";
$player1->Attack();
$player1->Defense();
echo "<hr/><br/>";
echo "梅西上場:<br/>";
$Messi=new Adapter();
$Messi->Attack();
$Messi->Defense();