Java实现23种设计模式(四):适配器模式(重点掌握)

二十三种设计模式分类

设计模式三大分类.jpg

一、概述

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

优点

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

缺点

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

场景

有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。


二、实现

1. 结构图

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器模式

PS: 类适配器模式耦合度比较高,要求了解组件库中相关组件的内部结构,相对于对象适配器模式用得相对较少;

对象适配器模式

PS:UML结构图可以参考,例子实现并不根据UML图来完成,灵活实现即可;

2. 实现

package cn.missbe.model.adpater;

/**
 * Copyright (c) 2020.
 * Email: [email protected]
 *
 * @author lyg  2020/4/29 下午4:28
 * description:
 * 电压适配器:英国电压为240V,中国电压为220V
 **/

public class VoltageAdapter {
    public static UKCharger chinaCharger2UKCharger(ChinaCharger chinaCharger) {
        UKCharger ukCharger = new UKCharger();
        ukCharger.voltage = chinaCharger.voltage;
        ukCharger.frequency = chinaCharger.voltage;
        return ukCharger;
    }

    public static ChinaCharger uKCharger2ChinaCharger(UKCharger ukCharger) {
        ChinaCharger chinaCharger = new ChinaCharger();
        chinaCharger.voltage = ukCharger.voltage;
        chinaCharger.frequency = ukCharger.frequency;
        return chinaCharger;
    }
    public static void main(String[] args) {
        /*
         * 实现英国的充电器在中国能够使用,需要转换电压和频率
         */
        UKCharger ukCharger = new UKCharger();
        ChinaCharger chinaCharger = VoltageAdapter.uKCharger2ChinaCharger(ukCharger);
        chinaCharger.charger();

        /*
         * 实现中国的充电器在英国能够使用,需要转换电压和频率
         */
        ukCharger = VoltageAdapter.chinaCharger2UKCharger(chinaCharger);
        ukCharger.charger();
    }
}

/**
 * 英国的充电器标准
 */
class UKCharger {
    String voltage = "240v";
    String frequency = "50HZ";

    public void charger() {
        System.out.println("UKCharger is Charging.");
    }
}

/**
 * 中国的充电器标准
 */
class ChinaCharger {
    String voltage = "220v";
    String frequency = "50HZ";

    public void charger() {
        System.out.println("ChinaCharger is Charging.");
    }
}

你可能感兴趣的:(Java实现23种设计模式(四):适配器模式(重点掌握))