Adaptor 转接器模式

今天开始要介绍 Structural patterns。先前的 Creational patterns 着重在如何根据不同的问题建立一个新的物件,而 Structural patterns 则着重在如何连结、组合已经存在的物件来解决问题。

转接器模式

这个模式其实大家相对熟悉,生活当中的各种「转接头」其实就是转接器模式的应用。转接器最大的目的在於,将两个「不同介面」的物件组合在一起,譬如

  • 英国插头和台湾插座
  • 电脑的 USB-C 和 萤幕的 HDMI

等等。接下来让我们看一下简单的例子。

实作

这里有个 Time 类别,当中的静态方法 getTime 可以帮我们拿到当下的时间。另外一边有个 Printer 类别,当中的静态方法 printWithTitle 会回传字串给我们。

class Time {
  static getTime(): Date {
    return new Date()
  }
}

class Printer {
  static printWithTitle(title: string, data: string): string {
    return `${title}: ${data}`
  }
}

所以我们今天如果想要先用 Time 获得当下的时间,紧接着用 Printer 来帮我们「印」出来,所以会是下面这样

const time = Time.getTime()
Printer.printWithTitle('Now is', time)   // error

然而我们很快就会看到错误讯息,因为 printWithTitle 本身期待传入的资料都是字串,但这里我们却传入了一个 Date 物件,所以产生错误。

因此我们可以使用一个转接器,来帮助我们转换介面。以这里的例子,我们希望能够将 Date 转换成 string,所以转接器就会长得像下面这样

class Adaptor {
  static dateToString(data: Date): string {
    return data.toString()
  }
}

使用转接器过後,我们就可以顺利得到结果了

const time = Time.getTime()
Printer.printWithTitle('Now is',  Adaptor.dateToString(time))
Now is: Tue Sep 28 2021 11:55:12 GMT+0000 (Coordinated Universal Time)

优点与缺点

使用转接器的优点是,可以让原本两个类别都专注在自己的功能上面,不需要去管因为他人使用而造成的介面转接问题。然而缺点是,如果我们已经很确定使用者是谁,那麽其实我们可以直接转换成使用者需要的介面,也就不需要额外创造一个新的转接器来使用。

转接器模式提供了一个快速解决问题的方案,但在稳定、可期待的使用场景之中,转接器看起来就没有那麽必要了。


<<:  Flutter体验 Day 29-flame Collidable

>>:  NNI搬到Colab的优劣

Day 5 - 部署 Home Lab 网路 - 下

那昨天安装好路由器後,我们要来架设一下 VPN。 在此之前,我们今天先来说明一下 VPN 是什麽。 ...

【资料库系统】 L3 SQL 入门

L3 SQL 入门 3-1 SQL 概述 资料操作语言(DML):提供资料修改删除等操作指令 完整性...

Day 18 - UML x Component — Button

Button 是网页中最常用的元件,跟他相依的元件和情境也不少,因此虽然他不是一个介面,依然还是可...

Android Studio 菜鸟笔记本-Day 27-BottomNavigationView的应用

昨天介绍了BottomNavigationView的使用方法,今天我要分享使用BottomNavig...

Proxmox VE 虚拟机防火墙管理 (一)

在网路防护方面,Proxmox VE 提供了相当良好的防火墙管理功能,并且可以适用於节点实体机、客...