海角不转弯

代码是梦想的砖

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类可以一起工作。

适配器的用意是将接口不同而功能相同或者相近的两个接口加以转换,为适配器角色补充一个原角色没有的方法。

一、类的适配器模式

把被适配的类的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 }
View Code

 

 

二、对象的适配器模式

与类的适配器模式一样,对象的适配器模式把被适配的类的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  }
View Code

 

 

posted on 2013-05-20 10:35  海角不转弯  阅读(181)  评论(0编辑  收藏  举报