二十三种设计模式分类
一、概述
适配器模式(Adapter Pattern
)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
优点
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
缺点
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是
A
接口,其实内部被适配成了B
接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 - 由于
JAVA
至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
场景
有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
二、实现
1. 结构图
适配器模式(Adapter
)包含以下主要角色:
- 目标(
Target
)接口:当前系统业务所期待的接口,它可以是抽象类或接口。 - 适配者(
Adaptee
)类:它是被访问和适配的现存组件库中的组件接口。 - 适配器(
Adapter
)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
PS
: 类适配器模式耦合度比较高,要求了解组件库中相关组件的内部结构,相对于对象适配器模式用得相对较少;
PS
:UML
结构图可以参考,例子实现并不根据UML
图来完成,灵活实现即可;
2. 实现
package cn.missbe.model.adpater;
/**
* Copyright (c) 2020.
* Email: love1208tt@foxmail.com
*
* @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.");
}
}