【Gang of Four】デザインパターン学習 - Facade


Facade - 外見

目次
クライアントがあるサブシステムを利用する場合、そのままでは複雑なインタフェースを最低限必要なインターフェースのみにまとめるようなパターンです。
当該サブシステムをカスタマイズするようなことがない場合、Facadeパターンを適用したインターフェースのみ注視することによりサブシステムを利用しやすくさせます。

要はクライアントとサブシステムの結合度を弱めるためですね。サブシステムを変更する際も結合度が弱いためし易くなります。

目的

サブシステム内に存在する複数のインタフェースに1つの統一インタフェースを与える。Facade パターンはサブシステムの利用を容易にするための高レベルインタフェースを定義する。

構成要素

・Facade クライアントがサブシステムを利用するにあたって必要最低限のインターフェースを定義するクラス
・サブシステム内のクラス 利用するサブシステム

構成要素のうちサブシステム内のクラスだけ何故ちゃんとした名前がついていないんでしょう…

実装

窓口を新たに作成するだけですがサンプルコードを書きます。

サブシステム内のクラス 利用するサブシステム

プリンタークラス インターフェース色々

Printer.kt
package facade

class Printer {
    fun startUp() { print("起動") }
    fun shutDown() { print("終了") }
    fun setToner(color: String) { print("トナーを${color}色に設定します。") }
    fun addPaper(num: Int) { print("紙を${num}枚追加します。") }
    fun login(name: String) { print("ユーザ${name}がログインしました。") }
    fun printOut(num: Int) { print("${num}枚印刷します。") }
}

クライアントがプリンターを操作する上で必要なのは印刷することだけなので、それのみの窓口を用意します。

Facade クライアントがサブシステムを利用するにあたって必要最低限のインターフェースを定義するクラス

インターフェースを限定

FacadePrinter.kt
package facade

class FacadePrinter {
    private val printer = Printer()

    fun printOut(num: Int) {
        printer.printOut(num)
    }
}

クライアント

Client.kt
package facade

class Client {
    init {
        val printer = FacadePrinter()
        printer.printOut(15)

        // 他のメソッドは使用できない
        // printer.startUp()
        // pritner.shutDown()
    }
}

出力結果

結果といっても大したものはないですが

[output]
15枚印刷します。

なんかこれは自分の認識が間違っちゅう気がする。コメントにてご指摘ください。