适配器模式

  • UML类图

适配器模式_第1张图片
适配器UML类图
  • 引入

适配器模式主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。比如德国,使用的是德国标准,是两项圆头的插头。如果去德国旅游,那么我们使用的手机充电器插头无法插到德国的插排中去,那就意味着我们无法给手机充电。怎样解决这个问题呢?只要使用一个电源转化器就行了。

  • 使用场景

用电源接口做例子,笔记本电脑的电源一般都是接受5V的电压,但是我们生活中的电线电压一般都是220V的输出。这个时候就出现了不匹配的状况,在软件开发中我们称之为接口不兼容,此时就需要适配器来进行一个接口转换。在软件开发中有一句话正好体现了这点:任何问题都可以加一个中间层来解决。这个层我们可以理解为这里的Adapter层,通过这层来进行一个接口转换就达到了兼容的目的。

  • 代码举例实现

DBSocketInterface.java

 package com.design.adapter;

 public interface DBSocketInterface {
    //使用两项圆头的插口供电 
    void powerWithTwoRound(); 
 }

DBSocketInterfaceImpl.java

 package com.design.adapter;

 public class DBSocketInterfaceImpl implements DBSocketInterface{

    @Override
    public void powerWithTwoRound() {
        System.out.println("使用两项圆头的插孔供电");
    }

 }

GBSocketInterface.java

 package com.design.adapter;
 //国标接口 
 public interface GBSocketInterface {
    void powerWithThreeFlat();  
 }

GBSocketInterfaceImpl.java

 package com.design.adapter;

 public class GBSocketInterfaceImpl implements GBSocketInterface{

    public void powerWithThreeFlat() {
        System.out.println("使用三项扁头插孔供电");  
    }

 }

SocketAdapter.java
这就是我们的重要的适配器类

 package com.design.adapter;

 public class SocketAdapter implements DBSocketInterface{

    //组合新接口  
    private GBSocketInterface gbSocket;  

    public SocketAdapter(GBSocketInterface gbSocket) {  
        this.gbSocket = gbSocket;  
    }  

    @Override  
    public void powerWithTwoRound() {  
  
        gbSocket.powerWithThreeFlat();  
    }  
 }  

DBHotel.java

package com.design.adapter;

public class DBHotel {
   
   private DBSocketInterface dbSocket;
   
   public DBHotel(DBSocketInterface dbSocket) {  
       this.dbSocket = dbSocket;  
   }  
   
   public void charge(){  
       
       //使用德标插口充电  
       dbSocket.powerWithTwoRound();  
   }  
}

App.java

package com.design.adapter;

public class App {

   public static void main(String[] args) {
       //我去德国旅游,带去的充电器是国标的
       GBSocketInterface gbSocket = new GBSocketInterfaceImpl();  
       //由于没法充电,我拿出随身带去的适配器,并且将我带来的充电器插在适配器的上端插孔中。这个上端插孔是符合国标的,我的充电器完全可以插进去。
       SocketAdapter socketAdapter = new SocketAdapter(gbSocket); 
       //找到一家德国宾馆住下,并且插上适配器
       DBHotel hotel = new DBHotel(socketAdapter); 
       //可以充电了
       hotel.charge();
   }
}
  • 总结

优点

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

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

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

你可能感兴趣的:(适配器模式)