【目的】:将一个类的接口转换成客户希望的另外一个接口,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();