干啥的?
其实就像是插座转换器,能让你的插头既能使用大陆的,也能使用港版的。
将一个不适用客户端的接口进行转换成适用的。
模式角色
- 目标抽象类:抽象方式类父类
- 适配器类: 用于转换的仿生类
- 适配者类:被转换的源生类
- 客户端
示例代码
<?php
include('init.php');
//抽象机器人
interface Robot
{
public function run();
public function shout();
}
//小狗
class Dog
{
public function run()
{
echo "dog run~~~~~\n";
}
public function shout()
{
echo "汪汪汪! \n";
}
}
//老鼠
class Mouse
{
public function run()
{
echo "mouse run~~~~~\n";
}
public function shout()
{
echo "吱吱吱 \n";
}
}
//动物仿生机器人
class AnimalRobot implements Robot
{
protected $animalIns;
public function __construct($animalIns)
{
$this->animalIns = $animalIns;
}
public function run()
{
$this->animalIns->run();
}
public function shout()
{
$this->animalIns->shout();
}
}
//客户端
class AnimalClient
{
public function test()
{
$dog = new Dog();
$robot = new AnimalRobot($dog);
$robot->run();
$robot->shout();
$mouse = new Mouse();
$robot = new AnimalRobot($mouse);
$robot->run();
$robot->shout();
}
}
$animalClient = new AnimalClient();
$animalClient->test();
?>
优点
-
将目标类和适配者类解耦,通过使用适配器让不兼容的接口变成了兼容,让客户从实现的接口解耦。
-
增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
-
灵活性和扩展性都非常好在不修改原有代码的基础上增加新的适配器类,符合“开闭原则”。