zoukankan      html  css  js  c++  java
  • 设计模式学习--------5.适配器模式学习

    场景:

           系统升级后,定义了一套新的接口逻辑,但是希望新的接口能兼容旧的功能,比如有些用户没有升级

    新版本,还是使用旧的接口和功能.

           类比原来的插头和插孔是两箱的,现在插孔换成或者叫定义成了三箱,这样三箱的插头才可以使用,

    来两箱的需要用一个转换器或者叫适配器将两箱转成三箱,这样就可以继续使用.


    定义:

          将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可

    一起工作.


    角色:

         Target:新的业务接口

    package com.kris.study;
    
    public interface Target {
        public void request();
    }
    

         Adaptee:已经存在的功能,通常能满足客户端要求,但是与新接口的方法定义不一致,需要被适配

    package com.kris.study;
    
    public class Adaptee {
       public void oldRequest(String s){
    	   System.out.println(s);
       }
    }
    

         Adapter: 适配器,把Adaptee适配成为Client需要的Target.

    package com.kris.study;
    
    public class Adapter implements Target{
    
    	private Adaptee adaptee;
    	
    	public Adapter(Adaptee adaptee){
    		this.adaptee = adaptee;
    	}
    	
    	@Override
    	public void request() {
    		adaptee.oldRequest("old method invoke");
    	}
    
    }
    

         Client: 客户端,调用Target接口实现业务

    package com.kris.study;
    
    public class Client {
       public static void main(String[] args) {
    	   Adaptee adaptee = new Adaptee();
    	   Adapter adapter = new Adapter(adaptee);
    	   adapter.request();
       }
    }
    


    原理分析:

           适配器的本质是: 转换匹配,复用功能.

            通过转换调用已有实现,从而能把已有的实现匹配成需要的接口,使之满足新的业务需要,所以转换匹配是手段,复用已有功能才是目的。

            适配器实际上利用了对象组合的方式

            一个适配器可以适配多个Adaptee,也就是实现新的Target接口时需要调用多个不同的模块,也可以缺省实现,简单

    的转换接口的参数.复杂度取决于Target和Adaptee的相似程度.

           一个适配器也可以进行双向适配,比如上面的例子同时让新的接口实现类TargetImpl去适配Adaptee接口.


    优点:

             更好的复用性,扩展性.

    缺点:

             当旧的功能与新的接口功能相似度很低时,使用适配还不如重写方便

             当过多的使用适配器,会导致系统零乱,明明是调用A的接口,实际上却是通过B的接口来实现.这时应该选择重构.

  • 相关阅读:
    use paramiko to connect remote server and execute command
    protect golang source code
    adjust jedi vim to python2 and python3
    install vim plugin local file offline
    add swap file if you only have 1G RAM
    datatables hyperlink in td
    django rest framework custom json format
    【JAVA基础】网络编程
    【JAVA基础】多线程
    【JAVA基础】String类的概述和使用
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748300.html
Copyright © 2011-2022 走看看