今天开始要介绍 Structural patterns。先前的 Creational patterns 着重在如何根据不同的问题建立一个新的物件,而 Structural patterns 则着重在如何连结、组合已经存在的物件来解决问题。
这个模式其实大家相对熟悉,生活当中的各种「转接头」其实就是转接器模式的应用。转接器最大的目的在於,将两个「不同介面」的物件组合在一起,譬如
等等。接下来让我们看一下简单的例子。
这里有个 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
那昨天安装好路由器後,我们要来架设一下 VPN。 在此之前,我们今天先来说明一下 VPN 是什麽。 ...
L3 SQL 入门 3-1 SQL 概述 资料操作语言(DML):提供资料修改删除等操作指令 完整性...
Button 是网页中最常用的元件,跟他相依的元件和情境也不少,因此虽然他不是一个介面,依然还是可...
昨天介绍了BottomNavigationView的使用方法,今天我要分享使用BottomNavig...
在网路防护方面,Proxmox VE 提供了相当良好的防火墙管理功能,并且可以适用於节点实体机、客...