适配器模式
参考自:http://blog.youkuaiyun.com/wzllai/article/details/7832815
适配器模式,可以将截然不同的函数接口封装成统一的API;
适配器模式将一个类的接口,转换成客户期望的另一个接口;
是的原本由于接口不兼容无法一起工作的类可以一起工作;解决兼容性;
透明:通过适配器,客户端可以调用同一个接口,因而对客户端来说是透明的,这样做更简单、更直接、更紧凑。
重用:复用了现存的类,解决了现存类和复用环境要求不一致的问题。
低耦合:将目标类和适配者类解耦,通过引入一个适配器类重用现用的适配者类,而无需修改原有代码。(遵循开闭原则)
应用场景:
PHP的数据库操作有mysql,mysqli,pdo3种,可以用适配器模式统一成一致。类似的像memcache,redis,file,apc等不同的缓存函数统一成一致;适配器作为一个中间层来实现不同功能转换。适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。
类适配器:(使用继承方式实现)
client类最终面对的是Target接口(或者抽象类),它只能使用符合这个标准的子类(Adapter)。
类适配器(Adapter)继承原有的Adaptee类,自己实现原有类没有的操作,从而达到适配。client可以透明调用Adaptee中的特殊功能。
interface ITarget
{
function operation1();
function operation2();
}
interface IAdaptee
{
function operation1();
}
class Adaptee extends IAdaptee
{
public function operation1()
{
echo "原方法";
}
}
class Adapter extends Adaptee implements IAdaptee, ITarget
{
public function operation2()
{
echo "适配方法";
}
}
class Client
{
public function test()
{
$adapter = new Adapter();
$adapter->operation1();//原方法
$adapter->operation2();//适配方法
}
}
对象适配器:(使用组合模式实现)
将adaptee作为adapter的一个引用。用该引用来调用所有adaptee中的方法。同时adapter实现客户期望的接口,达到适配。
由于组合在耦合性小于继承,对象适配器更加灵活。缺点就是增加代码量,需要重写adapee中的方法量。
interface ITarget
{
function operation1();
function operation2();
}
interface IAdaptee
{
function operation1();
}
class Adaptee extends IAdaptee
{
public function operation1()
{
echo "原方法";
}
}
class Adapter implements ITarget
{
private $adaptee;
public function __construct($adaptee)
{
$this->adaptee = $adaptee;
}
public function operation1()
{
return $this->adaptee->operation1();
}
public function operation2()
{
echo "适配方法";
}
}
class Client
{
public function test()
{
$adapter = new Adapter(new Adaptee(null));
$adapter->operation1();//原方法
$adapter->operation2();//适配方法
}
}
//如果adapee中的方法量比较大的话,可以考虑再adapter中使用__call方法来委托取得客户端调用的方法。
public function __call($func, $args)
{
if (is_callable(array($this->adaptee, $func))) {
return $this->adaptee->$func($args);
}
trigger_error('*********', E_USER_ERROR);
}
未完待续……….