• Java模式—适配器模式


    适配器模式(Adapter):

    1、概念:将一个类中的接口转换为客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

    2、模式中的角色

      1 目标接口:客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

      2 需要适配的类:需要适配的类或适配者类。

      3 适配器:通过包装一个需要适配的对象,把原接口转换成目标接口。  

    3、实现方式

        1 类的适配器模式(采用继承实现)

        2 对象适配器(采用对象组合方式实现)

    4 代码

    1.类适配器, 适配器类,既继承了被适配类,又同时实现标准接口 

     1 //已存在的、具有特殊功能、但不符合我们既有的标准接口的类 2 class Adaptee {  
     3     public void specificRequest() {  
     4         System.out.println("需要适配的类");  
     5     }  
     6 }  
     7   
     8 // 目标接口 
     9 interface Target {  
    10     public void request();  
    11 }  
    12   
    13 // 具体目标类,只提供普通功能  
    14 class ConcreteTarget implements Target {  
    15     public void request() {  
    16         System.out.println("原来存在的类");  
    17     }  
    18 }  
    19    
    20 // 适配器类,继承了被适配类,同时实现标准接口  
    21 class Adapter extends Adaptee implements Target{  
    22     public void request() {  
    23         super.specificRequest();  
    24     }  
    25 }  
    26    
    27 // 测试类
    28 public static void main(String[] args) { 29 // 使用普通功能类 30 Target concreteTarget = new ConcreteTarget(); 31 concreteTarget.request(); 32 33 // 使用特殊功能类,即适配类 34 Target adapter = new Adapter(); 35 adapter.request(); 36 } 37 }

    2 对象适配器

     1 public class Test12 {
     2     public static void main(String[] args) {
     3         //原接口的调用方式
     4         PowerA a=new PowerAImpl();
     5         input(a);
     6         
     7         PowerB b=new PowerBImpl();
     8         //input(B);不能用,因为input方法只能接受PowerA接口
     9         PowerAdapter adapter=new PowerAdapter(b);
    10         input(adapter);
    11     }
    12     //系统的方法与B接口不兼容,但是需要继续使用
    13     public static void input(PowerA a){
    14         a.connect();
    15     }
    16 }
    17 //适配器,可以适配电源A适配器
    18 class PowerAdapter implements PowerA{
    19     // 直接关联被适配接口
    20    private PowerB b;
    21    public PowerAdapter(PowerB b){
    22        this.b=b;
    23        
    24    }
    25    //在适配器里调用接口B的方法
    26     @Override
    27     public void connect() {
    28                b.insert();    
    29     }
    30     
    31 }
    32 
    33 //需要适配的接口B
    34 interface PowerB{
    35     public void insert();
    36 }
    37 class PowerBImpl implements PowerB{
    38 
    39     @Override
    40     public void insert() {
    41         System.out.println("电源B接口开始工作");    
    42     }
    43     
    44 }
    45 
    46 //电源A接口,系统原有接口
    47 interface PowerA{
    48     public void connect();
    49 }
    50 class PowerAImpl implements PowerA{
    51 
    52     @Override
    53     public void connect() {
    54         System.out.println("电源A接口开始工作");        
    55     }
    56     
    57 }

    5 总结
         (1)类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。

       (2)对于类适配器,由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理  Adaptee的子类了。

         对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。

       (3)对于类适配器,适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。

          对于对象适配器,要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。

       (4)对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。

          对于对象适配器,需要额外的引用来间接得到Adaptee。

      建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。

    适配器模式的优点

        更好的复用性

      系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

        更好的扩展性

      在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

    适配器模式的缺点

      过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

     

  • 相关阅读:
    table的好处
    python使用split分隔字符串之后打印出来是乱码的问题
    关于python项目使用tornado框架时,加载不上静态资源(css/js)并报编码错误的问题
    马的遍历
    数据结构学习资料
    操作系统学习资料
    珠心算测验 C / C++
    拼数 C/C++
    神奇的幻方
    工艺品制作(多维数组应用)
  • 原文地址:https://www.cnblogs.com/chenxing818/p/4688398.html
Copyright © 2020-2023  润新知