首页 > 代码库 > Adapter设计模式

Adapter设计模式

Adapter模式

简介

<<设计模式>>一书中对Adapter模式的意图是这样描写的:

         将一个类的接口转换成客户希望的另一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。

         笔者自己对这段话的理解是,原本一个类功能符合,但是接口不符合,可以通过使用Adapter模式,为该类创建一个新的接口去适应。

         用一个浅显的现实中的例子,有一本电器说明书是英文的,被一个中国人买了。英文说明书就像是一个类,但是中国人不懂英文,无法读说明书去使用电器。只有一个办法,找个人去将英文说明书翻译成中文的说明书,而被翻译的说明书就是一个新的接口。

         下面笔者就通过一个简单的案例来说明Adapter模式。

案例

         一个接口(Interface)去描述一个国家,Country接口(Interface),然后有描述具体国家的类,例如China类,Japan类等,这些类实现Country接口。在Country接口中定义方法,如:

getName();//获取国家的名字        getPopulation();//获取该国家的人口。代码如下。

         Country接口:

       package pattern.adapter;

public interface Country{

              void getName();

              void getPopulation();

       }

       Japan类:

       package pattern.adapter;

       public class Japan  implements Country{

              void getName(){//获取国家的名字

 

              }

              void getPopulation(){//获取国家的人口

                    

              }

       }

       China类:

package pattern.adapter;

 

       public class China  implements Country{

              void getName(){//获得国家的名字

 

              }

              void getPopulation(){//获得国家的人口

                    

              }

       }

       但是,当我们要去再实现一个类去描述另一个国家例如India,可能实现一个类特别麻烦,所以我们去调用其它人写好的类,功能完全符合我们的需求。例如:有一个已经现存的类India类,如下:

package pattern;

 

       public class India{

              void getTheName(){//获得国家的名字

 

              }

              void getThePopulation(){//获得国家的人口

 

              }

       }

我们发现上面的类India,完全符合我们的功能,但是方法名却和我们不同,我们无法通过调用接口Country方式去使用India这个类。也就是说India这个类和Country体系不兼容。

       为了解决上述问题,我们就可以使用Adapter模式,将India和Country类之间创建一个新的接口,使二者通过接口进行兼容。该接口为一个类,我将他起名为AdapterIndia。

 

package pattern.adapter;               //该类符合并实现了Country接口。

       import pattern.India;

       public class AdapterIndia  implements Country{

              private India aIndia;                 //通过组合的方式,调用India的对象

              AdapterIndia{

                     aIndia=new India();          

//通过India对象调用India对应的方法去实现具体的功能

              }

              void getName(){

//通过India对象调用India对应的方法去实现具体的功能

 

                     aIndia.getTheName();

              }

 

              void getPopulation(){

                     aIndia.getThePopulation;

              }

       }

下面是上面实例的类图,可以更加清晰的看清。

 技术分享

总结

意图:使控制范围之外的一个原有对象与某个接口匹配。

问题:系统的数据和功能都符合,只是接口不符合。

解决方法:Adapter设计模式。

实现:在控制范围之内创建一个接口(一般是一个类),将原有的类组合到新创建的接口中,在新创建的接口中通过调用该原有的类的对象调用该类的方法来实现具体的功能。

 

有人会问了,为什么不直接修改原有对象呢,一般原有对象中存在很多private域,如果改代码会产生很多不必要的麻烦。

 

 

 

本博客借鉴了设计模式解析(第二版)的内容,如果想详细了解该模式,可以直接阅读该书。

Adapter设计模式