美文网首页
适配器模式

适配器模式

作者: lguipeng | 来源:发表于2015-03-22 18:15 被阅读160次
    • UML类图

    适配器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接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

    相关文章

      网友评论

          本文标题:适配器模式

          本文链接:https://www.haomeiwen.com/subject/adfgxttx.html