机制拆解
A1. 要素 (Components)
- Target (目标接口):当前系统(客户)所期待的标准接口(如:
USB-C)。 - Adaptee (被适配者):现有的、不兼容的老组件(如:
HDMI接口)。 - Adapter (适配器):中间人。它实现 Target 接口,并在内部持有 Adaptee 的引用。
A2. 结构 (Structure)
- 组合式 : Adapter 类内部包含一个 Adaptee 的实例,在Adapter类里写一个Target所期待的接口,在接口的实现当中,执行核心的数据转换操作,并调用旧的Adaptee实例的接口,以此达到转换的目的。
- 调用链路:Client
Adapter.methodA()(转换参数/逻辑)Adaptee.methodB()。
A3. 系统 (System Function) 该系统实现了**“复用 (Reusability)”与“平滑过渡”**。它允许我们在不修改老代码(符合开闭原则)的前提下,让新老系统协同工作。
示例代码
// 1. Target: 新系统期待的标准接口
interface INotification {
send(content: string, phone: string): void;
}
// 2. Adaptee: 祖传的老代码 (模拟第三方库,无法修改)
class OldAliyunSDK {
public send_sms_xml(xmlData: string): void {
console.log(`[Old SDK] 正在解析XML并发送: ${xmlData}`);
}
}
// 3. Adapter: 适配器
class AliyunAdapter implements INotification {
private oldSDK: OldAliyunSDK;
constructor() {
this.oldSDK = new OldAliyunSDK();
}
// 实现新接口
public send(content: string, phone: string): void {
// 核心工作:数据转换 (Translation)
const xmlPayload = `<xml><phone>${phone}</phone><msg>${content}</msg></xml>`;
// 转发调用
this.oldSDK.send_sms_xml(xmlPayload);
}
}
// --- 业务代码 (Client) ---
function mainApp(service: INotification) {
service.send("您的验证码是 8888", "13800138000");
}
// 调用
const adapter = new AliyunAdapter();
mainApp(adapter);