设计模式与应用:适配器模式

版权声明: https://blog.csdn.net/maoyuanming0806/article/details/80340941

本文详细介绍两种实现适配器方式、应用场景及对比

简介

Adapter模式-适配器模式,是构造型模式之一

通过Adapter模式可以改变已有类(或外部类)的接口形式,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。

很容易想到usb接口(2.0、3.0等),电源适配器等等生活中很多例子

应用场景

大规模系统开发中,我们实现某些功能但不成熟,但重新开发会消耗大量时间,所以先暂时使用,以后考虑随时替换。而到了给他替换的时候,需要对引用该外部组件的源码大面积修改。因此已带来了很多问题。那么适配器模式就是针对此场景提出。

通过定义一个新的接口(对需要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)来透明的调用外部组件。这样替换外部组件时,最多只需要修改几个Adapter类就可以,其他源代码不会受到影响。

具体场景如:

  • 为未来预留更换下游方法实现的适配器,也就是先适配不完善的功能,之后更完善的功能出来后,转换适配。

  • 需要一个统一的输出接口,而输入端的类型不可预知。

  • 通过接口转换,将一个类插入另一个类系中。增强另一个类系的功能。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。比喻来源-菜鸟教程)
  • 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式
  • 适配器不是在具体设计时使用,而是解决已经上线的项目的接口升级等问题

结构图

继承实现Adapter

这里写图片描述

委让实现Adapter

这里写图片描述

实现

被适配的对象

package com.mym.designmodel.adapter;

public class Current {

    public void use220V(){
        System.out.println("使用220v");
    }
}

继承实现Adapter

继承

package com.mym.designmodel.adapter;

/**
 * 职责:继承式适配器。
 */
public class Adapter extends Current {

    /**适配方法*/
    public void use180v(){
        System.out.println("使用继承式适配器!");
        this.use220V();
    }
}

委让实现Adapter

委让

package com.mym.designmodel.adapter;

/**
 * 职责:适配器。委让式适配器。
 */
public class Adapter2 {

    Current current = null;

    public Adapter2(Current current){
        this.current = current;
    }

    public void use15v(){
        System.out.println("使用委让式适配器!");
        current.use220V();
    }
}

客户端测试

package com.mym.designmodel.adapter;

/**
 * 职责:客户端。测试
 */
public class MainClass {

    public static void main(String[] args) {
        // 未使用适配器
        Current current = new Current();
        current.use220V();

        System.out.println("-----------------------------");

        // 继承式适配器
        Adapter adapter = new Adapter();
        adapter.use180v();

        System.out.println("-----------------------------");

        // 继承式适配器
        Adapter2 adapter2 = new Adapter2(new Current());
        adapter2.use15v();
    }
}

适配器优缺点及两种适配方式对比

优点

  • 1、可以让任何两个没有关联的类一起运行。
  • 2、提高了类的复用。
  • 3、增加了类的透明度。
  • 4、灵活性好。

缺点

  • 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构

两种适配方式对比

  • 两方式都是为更换真实方法实现提供一种机制。但继承式的本就具有java单继承的局限
  • 委让式就是拥有老方法的引用,灵活性较高,比较推荐
  • 使用时仍然需要根据系统功能适配场景选用,相关可参考应用场景小节
阅读更多

扫码向博主提问

maoyuanming0806

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页