PHP设计模式-适配器模式

来源:互联网 发布:制作手写的软件 编辑:程序博客网 时间:2024/04/27 00:50

适配器模式

参考自:http://blog.csdn.net/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);              }  

未完待续……….

0 0
原创粉丝点击