机制拆解

A1. 要素 (Components)

  1. Target (目标接口):当前系统(客户)所期待的标准接口(如:USB-C)。
  2. Adaptee (被适配者):现有的、不兼容的老组件(如:HDMI 接口)。
  3. 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);