对象适配器使用的是委派
<?php
/**
* 类适配器模式
* @author guisu
*
*/
/**
* 目标角色
* @version 2.0
*/
interface Target {
/**
* 源类的方法:这个方法将来有可能继续改进
*/
public function hello();
/**
* 目标点
*/
public function world();
}
/**
* 源角色:被适配的角色
*/
class Adaptee {
/**
* 源类含有的方法
*/
public function world() {
echo ' world <br />';
}
/**
* 加入新的方法
*/
public function greet() {
echo ' Greet ';
}
}
/**
* 类适配器角色
*/
class Adapter implements Target {
private $_adaptee;
/**
* construct
*
* @param Adaptee $adaptee
*/
public function __construct(Adaptee $adaptee) {
$this->_adaptee = $adaptee;
}
/**
* 源类中没有world方法,在此补充
*/
public function hello() {
$this->_adaptee->greet();
}
/**
* 源类中没有world方法,在此补充
*/
public function world() {
$this->_adaptee->world();
}
}
/**
* 客户端程序
*
*/
class Client {
/**
* Main program.
*/
public static function main() {
$adaptee = new Adaptee();
$adapter = new Adapter($adaptee);
$adapter->hello();
$adapter->world();
}
}
Client::main();
?>
如例中代码所示,你可以运用适配器(Adapter)模式来避免因外部库改变所带来的不便——倘若向上兼容。作为某个库的开发者,你应该独立编写适配器,使你的用户更简便地使用新版本的库,而不用去修改他们现有的全部代码。
GoF书中提出的适配器(Adapter)模式更倾向于运用继承而不是组成。这在强类型语言中是有利的,因为适配器(Adapter)事实上是一个目标类的子类,因而能更好地与类中方法相结合。
了更好的灵活性,我个人比较倾向于组成的方法(特别是在结合了依赖性倒置的情况下);尽管如此,继承的方法提供两种版本的接口,或许在你的实际运用中反而是一个提高灵活性的关键。
10.适配器模式与其它相关模式
桥梁模式(bridge模式):桥梁模式与对象适配器类似,但是桥梁模式的出发点不同:桥梁模式目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而对象适配器模式则意味着改变一个已有对象的接口
装饰器模式(decorator模式):装饰模式增强了其他对象的功能而同时又不改变它的接口。因此装饰模式对应用的透明性比适配器更好。结果是decorator模式支持递归组合,而纯粹使用适配器是不可能实现这一点的。
Facade(外观模式):适配器模式的重点是改变一个单独类的API。Facade的目的是给由许多对象构成的整个子系统,提供更为简洁的接口。而适配器模式就是封装一个单独类,适配器模式经常用在需要第三方API协同工作的场合,设法把你的代码与第三方库隔离开来。







