🐿️
【デザインパターン】ファサードパターン - Facade
ファサードパターンとは、GoF(Gang of Four)デザインパターンの一つで、複雑になっている複数のクラスをまとめ、使いやすい形にして外部に提供する方法です。その複数のクラスのまとめ役が、窓口といわれるFacadeです。
ファサードパターンのコード
以下は「Subsystem1です Subsystem2です」の文字列を出力するサンプルコードです。
このコードでの複数のクラスは、Subsystem1とSubsystem2クラスを指します。それらをFacadeクラスにまとめて、外部に提供します。
class Facade {
protected subsystem1: Subsystem1
protected subsystem2: Subsystem2
constructor(subsystem1: Subsystem1, subsystem2: Subsystem2) {
this.subsystem1 = subsystem1 || new Subsystem1()
this.subsystem2 = subsystem2 || new Subsystem2()
}
public operation() {
return `${this.subsystem1.operation()} ${this.subsystem2.operation()}`
}
}
class Subsystem1 {
public operation = () => 'Subsystem1です'
}
class Subsystem2 {
public operation = () => 'Subsystem2です'
}
class Client {
protected facade: Facade
constructor(facade: Facade) {
this.facade = facade
}
public output() {
console.log(facade.operation())
}
}
const subsystem1 = new Subsystem1()
const subsystem2 = new Subsystem2()
const facade = new Facade(subsystem1, subsystem2)
const client = new Client(facade)
client.output() // Subsystem1です Subsystem2です
-
Facade
サブシステムの窓口となるクラスです -
Subsystem1
Subsystem2
Facadeから呼び出されて処理を行います -
Client
Facadeが提供するメソッドを呼出し、処理を行います
メリット
- 複数のサブシステム間の結合を減らすことができます
- サブシステムはFacadeに処理を任せるため、サブシステム自身が実行順序を気にしなくて済みます
- 複雑な内部処理(DB処理など)をFacadeが窓口になることで隠蔽でき、利用する側はその処理を使いやすくなります
参考
Discussion