📝 概述
- 适配器模式是一种结构型设计模式,它允许你在不修改现有代码的情况下使接口不兼容的对象能够相互合作。
🎯 概念:
-
想象一下,你有一些矩形的插头,但插座的孔是圆形的,因此你无法连接它们。为了使插头与插座匹配,你需要使用特定的适配器。这使得你无需更改插头或插座即可使两者合作。
-
在适配器模式中,这种概念应用于对象。我们有一个功能但其接口与我们的期望不匹配时,而不是重新写代码来适应新的接口或在系统中找到一个合适的服务,我们可以使用适配器来使现有的代码工作与其他接口一起工作。
🎯 实例:
- 在前面提到的旅行插头例子中,适配器的目的是连接两种不同的设备接口。我们的设备可能有一个类型的插头,而目的地的电源插座可能是另一种类型。适配器的工作是允许两者可以一起工作。
📝 结构
- 适配器模式 (Adapter) 包含以下主要角色:
- 目标 (Target): 这是你期望的接口,或者你现有的接口。
- 需要适配的类 (Adaptee): 你需要适配的接口或类。
- 适配器 (Adapter): 在真正的适配器模式中,这是连接目标接口和需要适配的类的中间对象。
📝 代码实现
📌 类适配器模式
-
类适配器模式使用继承来适配两个不兼容的接口。通过这种方式,适配器类可以同时继承目标接口和被适配者类,从而实现二者的兼容。
-
当客户端调用目标接口的方法时,适配器类转换这些调用为适配者类的方法调用。因为适配器类继承了适配者类,所以它可以调用适配者的方法;而由于它实现了目标接口,所以它也可以提供客户端期望的接口方法。
package com.study.notes.design.patterns.pattern.adapter.class_adapter.service;
/**
* @version v1.0
* @ClassName: SDCard
* @Description: 目标接口
* @Author: lzq
*/
public interface SDCard {
//从SD卡中读取数据
String readSD();
//往SD卡中写数据
void writeSD(String msg);
}
package com.study.notes.design.patterns.pattern.adapter.class_adapter.service;
/**
* @version v1.0
* @ClassName: TFCard
* @Description: 适配者类的接口
* @Author: lzq
*/
public interface TFCard {
//从TF卡中读取数据
String readTF();
//往TF卡中写数据
void writeTF(String msg);
}
package com.study.notes.design.patterns.pattern.adapter.class_adapter.service.impl;
import com.study.notes.design.patterns.pattern.adapter.class_adapter.service.SDCard;
/**
* @version v1.0
* @ClassName: SDCardImpl
* @Description: 具体的SD卡
* @Author: lzq
*/
public class SDCardImpl implements SDCard {
public String readSD() {
String msg = "SDCard read msg : hello word SD";
return msg;
}
public void writeSD(String msg) {
System.out.println("SDCard write msg :" + msg);
}
}
package com.study.notes.design.patterns.pattern.adapter.class_adapter.service.impl;
import com.study.notes.design.patterns.pattern.adapter.class_adapter.service.TFCard;
/**
* @version v1.0
* @ClassName: TFCardImpl
* @Description: 适配者类
* @Author: lzq
*/
public class TFCardImpl implements TFCard {
public String readTF() {
String msg = "TFCard read msg : hello word TFcard";
return msg;
}
public void writeTF(String msg) {
System.out.println("TFCard write msg :" + msg);
}
}
package com.study.notes.design.patterns.pattern.adapter.class_adapter.adapter;
import com.study.notes.design.patterns.pattern.adapter.class_adapter.service.SDCard;
import com.study.notes.design.patterns.pattern.adapter.class_adapter.service.impl.TFCardImpl;
/**
* @version v1.0
* @ClassName: SDAdapterTF
* @Description: 适配器类
* @Author: lzq
*/
public class SDAdapterTF extends TFCardImpl implements SDCard {
public String readSD() {
System.out.println("adapter read tf card");
return readTF();
}
public void writeSD(String msg) {
System.out.println("adapter write tf card");
writeTF(msg);
}
}
package com.study.notes.design.patterns.pattern.adapter.class_adapter;
import com.study.notes.design.patterns.pattern.adapter.class_adapter.adapter.SDAdapterTF;
import com.study.notes.design.patterns.pattern.adapter.class_adapter.bean.Computer;
import com.study.notes.design.patterns.pattern.adapter.class_adapter.service.impl.SDCardImpl;
/**
* @version v1.0
* @ClassName: Client
* @Description: TODO(一句话描述该类的功能)
* @Author: lzq
*/
public class Client {
public static void main(String[] args) {
//创建计算机对象
Computer computer = new Computer();
//读取SD卡中的数据
String msg = computer.readSD(new SDCardImpl());
System.out.println(msg);
System.out.println("===============");
//使用该电脑读取TF卡中的数据
//定义适配器类
String msg1 = computer.readSD(new SDAdapterTF());
System.out.println(msg1);
}
}
📌 对象适配器模式
- 对象适配器模式使用组合的方式来实现适配功能,而不是类适配器模式中的继承。在对象适配器模式中,适配器持有一个适配者的实例,并通过新的接口调用已存在的接口。
package com.study.notes.design.patterns.pattern.adapter.object_adapter.adapter;
import com.study.notes.design.patterns.pattern.adapter.object_adapter.service.SDCard;
import com.study.notes.design.patterns.pattern.adapter.object_adapter.service.TFCard;
/**
* @version v1.0
* @ClassName: SDAdapterTF
* @Description: 适配器类
* @Author: lzq
*/
public class SDAdapterTF implements SDCard {
//声明适配者类
private TFCard tfCard;
public SDAdapterTF(TFCard tfCard) {
this.tfCard = tfCard;
}
public String readSD() {
System.out.println("adapter read tf card");
return tfCard.readTF();
}
public void writeSD(String msg) {
System.out.println("adapter write tf card");
tfCard.writeTF(msg);
}
}
package com.study.notes.design.patterns.pattern.adapter.object_adapter;
import com.study.notes.design.patterns.pattern.adapter.object_adapter.adapter.SDAdapterTF;
import com.study.notes.design.patterns.pattern.adapter.object_adapter.service.impl.Computer;
import com.study.notes.design.patterns.pattern.adapter.object_adapter.service.impl.SDCardImpl;
import com.study.notes.design.patterns.pattern.adapter.object_adapter.service.impl.TFCardImpl;
/**
* @version v1.0
* @ClassName: Client
* @Description: TODO(一句话描述该类的功能)
* @Author: lzq
*/
public class Client {
public static void main(String[] args) {
//创建计算机对象
Computer computer = new Computer();
//读取SD卡中的数据
String msg = computer.readSD(new SDCardImpl());
System.out.println(msg);
System.out.println("===============");
//使用该电脑读取TF卡中的数据
//创建适配器类对象
SDAdapterTF sdAdapterTF = new SDAdapterTF(new TFCardImpl());
String msg1 = computer.readSD(sdAdapterTF);
System.out.println(msg1);
}
}
📌 接口适配器模式
- 当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter,实现所有方法。而此时我们只需要继承该抽象类即可。
📝 使用场景
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。使用第一方提供的组件,但组件接口定义和自己要求的接口定义不同