把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类可以一起工作。
适配器的用意是将接口不同而功能相同或者相近的两个接口加以转换,为适配器角色补充一个原角色没有的方法。
一、类的适配器模式
把被适配的类的API转换成目标类的API
涉及的角色:
目标角色(就是所期待的得到的接口,由于这里讨论的是类适配器,因此目标不可以是类 )
原角色adaptee 现有需要适配的接口。
适配器角色:适配器类,把源接口转换成目标接口。这一角色必须是类。
example:
1 /** 2 * 类的适配器模式 3 */ 4 interface Target{ 5 6 /** 7 * 这里是源类已有的方法 8 */ 9 public function sampleOperation1(); 10 /** 11 * 12 * 源类没有的方法 ... 13 */ 14 public function sampleOperation2(); 15 16 17 18 } 19 20 class adaptee{ 21 22 /** 23 * 此类为源类 24 */ 25 26 public function sampleOperation1(){ 27 28 } 29 30 } 31 /** 32 * 33 * 适配器-- ... 34 * @author Lujianchao 35 * 36 */ 37 38 class adapter extends adaptee implements Target{ 39 40 41 42 public function sampleOperation2(){ 43 44 //some actions 45 } 46 47 }
二、对象的适配器模式
与类的适配器模式一样,对象的适配器模式把被适配的类的API钻换成目标类的API,不同的是,对象适配器模式不再使用继承,而是运用委派关系连接到apatee类。
因此可以通过委派将多种不同的源适配到同一个目标。这是与类适配器的区别。。
但是,想要置换掉源类的方法不容易,如果一定要,则只好先做一个源类的子类,将源类方法置换掉。然后把源类的子类当做真正的源进行适配。
置换不易但是添加易。
example:
1 /** 2 * 对象适配器 3 * 4 */ 5 6 interface Target{ 7 8 /** 9 * 这里是源类已有的方法 10 */ 11 public function sampleOperation1(); 12 /** 13 * 14 * 源类没有的方法 ... 15 */ 16 public function sampleOperation2(); 17 18 19 20 } 21 22 class adaptee{ 23 24 /** 25 * 此类为源类 26 */ 27 28 public function sampleOperation1(){ 29 30 } 31 32 } 33 34 /** 35 * 36 * 没有继承关系 ... 37 * @author Lujianchao 38 * 39 */ 40 class Adapter implements Target{ 41 42 private $adaptee; 43 44 /** 45 * 46 * 委托.. 47 * @param $adaptee 48 */ 49 50 public function Adapter(adaptee $adaptee){ 51 52 $this->adaptee=$adaptee; 53 } 54 55 /** 56 * 委派 57 */ 58 59 public function sampleOperation1(){ 60 61 $this->adaptee->sampleOperation1(); 62 } 63 64 /** 65 *需要的方法 66 * 67 */ 68 69 public function sampleOperation2(){ 70 71 //this is your code 72 73 } 74 75 76 }