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

  • 相关阅读:
    在spring官网上下载历史版本的spring插件,springsource-tool-suite
    转载---VB DorpDownList控件 添加选项
    VB,将"秒"转成"时分秒"格式
    VB.NET 改变datatable数据类型
    转载--- C# 图片与base64编码 互相转换
    转载--- php5.6:Call to undefined function curl_init()的解决办法
    转载--- navicat12破解版(英文、中文)
    转载---mysql导出事件、存储过程、函数、库表
    C# 读取mysql blob字段(两种方式)
    转载---安装mysql5.7,遇到的问题
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748300.html
Copyright © 2011-2022 走看看