【读书笔记】大话设计模式—适配器模式

适配器模式 (使用频率:4颗星)

 适配器模式可以将一个类的接口和另一个类的接口匹配起来,而无须修改原来的适配者接口和抽象目标类接口。适配器模式定义如下:

适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

【注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。】

       在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系在实际开发中,对象适配器的使用频率更高,对象适配器模式结构如图9-3所示:

【读书笔记】大话设计模式—适配器模式_第1张图片

 9-3 对象适配器模式结构图

       在对象适配器模式结构图中包含如下几个角色:

       ● Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。

       ● Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对AdapteeTarget进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。

       ● Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。

类的适配器模式

比如有这样一个变压器,可以转换220V电压和380V电压

[java] view plain copy print?
  1. public class Transformer{  
  2.        
  3.       public void change220V(){  
  4.              //输出10V电压  
  5.       }  
  6.    
  7.       public void change380V (){  
  8.              //输出10V电压  
  9.       }  
  10.    
  11. }  

现在需要增加一种功能,转换500V的电压,下面用类的适配器模式改造

先定义一个接口,列出了所有需要的转换功能

[java] view plain copy print?
  1. public interface ITransformer{  
  2.       public abstract void change220V();  
  3.       public abstract void change380V();  
  4.       public abstract void change500V();  
  5. }  

适配器继承了Transformer类并实现了ITransformer接口

[java] view plain copy print?
  1. public classAdapter extends Transformer implements ITransformer{  
  2.       public void change500V(){  
  3.              //输出10V电压  
  4.       }  
  5. }  

Adapter继承了Transformer类,所以change220V方法与change380V方法都已经存在,只需要实现ITransformer接口中的change500V方法即可

现在Adapter类就可以转换220V、380V、500V三种类型的电压了

因为Adapter继承了Transformer,java是单继承的语言,这个适配器只能为Transformer这一个类服务,所以称之为类的适配器模式

对象的适配器模式

与类的适配器模式不同的是,对象的适配器模式把要改造的目标聚合到适配器类中,同样的变压器问题,对象的适配器模式写法如下:

Transformer类和ITransformer接口与上面完全一样

[java] view plain copy print?
  1. public class Adapter implements ITransformer{  
  2.       Transformertransformer ;   
  3.       //由构造方法传入Transformer对象  
  4.       public Adapter (Transformer transformer){  
  5.              this.transformer = transformer;  
  6.       }  
  7.       // Transformer类中存在的方法则直接调用  
  8.       public void change220V(){  
  9.              transformer.change220V();  
  10.       }  
  11.    
  12.       public void change380V (){  
  13.              transformer.change220V();  
  14.       }  
  15.    
  16.       // Transformer类中没有的方法则新建  
  17.       public void change500V(){  
  18.              //输出10V电压  
  19.       }  
  20. }  
这种适配器模式可用于多个源的改造,比如,还有一个变压器只有change220V方法,则把这个类传入适配器中,然后新建change380V和change500V两个方法。当然,这需要增加判断语句,先要判断这个类缺失哪种方法,然后跳到分支语句块进行相应的处理,这样不论传入哪种源,都可以得到符合要求的适配器

你可能感兴趣的:(设计模式)