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的接口来实现.这时应该选择重构.

  • 相关阅读:
    Android 自定义ProgressDialog
    Android 设置TextView字体颜色
    Android 隐藏EditText的焦点
    Android TextView点击效果
    区间问题 codeforces 422c+hiho区间求差问
    hdu 5651 重复全排列+逆元
    hdu 1576
    C Looooops
    扩展欧几里得模板
    hdu 6025(女生赛)
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748300.html
Copyright © 2011-2022 走看看