23种设计模式-适配器模式

1.产生背景

  • 为什么需要适配器模式

这里写图片描述

现在很多笔记本已经取消了有线网口,所以如果还想使用网线连接网络只能使用其它方式:
这里写图片描述

这个USB网线转换接口,就是一个适配器,它连接两个不直接对接的对象
这里写图片描述

2.概念

是作为两个不兼容的接口之间的桥梁。它结合了两个独立接口的功能。

本质: 有两个不兼容的对象A,B需要对接,统过引入一个中介对象,这个中介对象一边兼容A,一边兼容B, 以实现A,B通过中介对象进行对接;

3.目的

将一个类的接口转化成客户希望的另一个接口,让不兼容的对象之间可以间接调用

4.解决方案

本质:引入第三方中介类,这个类分别满足不兼容的两边接口,并通过中介内部把不兼容的数据进行转换处理,以适应两边;

  • 引入中介对象
  • 中介对象分别实现两个不兼容的接口(被调、调用)
  • 中介对象内部实现两个不兼容接口的数据转换、处理、清洗;

这里写图片描述

    //调用方
    public class Client{
        @Autowired
        IOperater opt;

        void invoke(){
            opt.operate("laoYang",18);
        }
    }

    //被调用接口
    public interface IOperater{
        void operate(String name,Integer age);
    }
    //需要被适配的类
    public class  Adaptee{
        public void operate(String name,String age){
            System.out.println("我的名字是:" + name + ",今年年龄:" + age );
        }
    }

    //适配器
    public class Adapter implements IOperater{
        @Autowired
        Adatee adatee;

        public void operate(String name,Integer age){
            String ageTemp = age.toString();
            adatee.doSomething(name,ageTemp);
        }
    }

5. 类图

6.优缺点

优点:

  • 将两个类联系起来
    最终目的是把两个不兼容的对象连接起来,是不兼容的桥梁;

  • 松耦合
    不兼容的两方均不需要修改变更,就可以相互调用;

  • 扩展性高
    只需要增加不同的适配器,可以与”任何”不兼容的一方对接;

最核心的目的:在不修改原代码的情况下,作为桥梁,连接不兼容的双方

缺点:

  • 结构凌乱
    本来面向抽象编程,但由于引入适配器(适配器本身可以面向抽象),被适配者则不面向抽象,导致代码不按规范,以及增加了过多的与业务无关的适配器,会导致结构和代码的凌乱;

  • 不能适配所有情况
    java为单继承,因此只能适配一个适配类;

  • 不能完全不修改适配双方的代码
    适配双方不在同一个项目,不是同一种编程语言,没有面向抽象编写,都有可能需要一方进行部分代码的修改;

7.应用场景

  • 已经存在的历史系统需要对接,且双方都不愿意或不能变更自身
    如:IBM早年提出的为了消除信息孤岛,打通各个现有系统时,由于各个系统的早期规划和设计并不相互依赖,因此并不能直接进行调用,此时,就可以通过“适配器”进行接口间的适配、转换、数据洗清;

  • 一方的发展不考虑另一方
    如:spring Handler 包含实现了Controller接口,配置了@Controller注解的类,以及Servlet类;未来handler的种类可能还会更多;而这些handler的发展和产生,并不会考虑和依赖spring的发展,因此,spring是无法预测和硬编码对各种handler的调用;
    此时,就可以考虑使用Adapter模式来提高Spring的扩展性;只需要让adapter面向接口编程,未来通过增加Adapter实例子,来实现spring与handler之间的调用;

8.现实案例

spring HandlerAdapter

9. 注意事项

万不得一时再使用Adapter,否则,应该整体设计和规划,尽可能的面向抽象编程,减少adapter的存在;

猜你喜欢

转载自blog.csdn.net/yangspgao/article/details/80555537