kakke18’s blog

ゆるふわ学生エンジニア

Bridge-機能の階層と実装の階層を分ける-

Java言語で学ぶデザインパターン入門 の第9章を参考にしました。

Bridgeパターンとは

本書には以下のように記載されています。

「機能のクラス階層」と「実装のクラス階層」を橋渡しする

まず、「機能のクラス階層」と「実装のクラス階層」の説明をしていきます。

機能のクラス階層

あるクラスSomethingがあったとします。 新しい機能(新しいメソッド)を追加するとき、Somethingクラスのサブクラスとして、 SomethingGoodクラスを作ります。 ここでSomethingとSomethingGoodによる小さなクラス階層ができました。 ここでは、スーパークラスは基本的な機能を持っており、サブクラスで新しい機能を追加します。 このように機能を追加するために作られた階層を「機能のクラス階層」といいます。

実装のクラス階層

あるスーパークラスAbstractClassの抽象メソッドを実装したサブクラスをConcreteClassとすると、 ここでも、この2つのクラスによる小さなクラス階層ができました。 ここでは、スーパークラスが抽象メソッドによって規定したインターフェースをサブクラスが具象メソッドによって実装します。 このように実装を追加するために作られた階層を「実装のクラス階層」といいます。

実装

こちらを参考にしてください。

クラス階層

このサンプルプログラムでの階層は以下のようになっています。

  • 機能のクラス階層
    • Displayクラス
    • CountDisplayクラス
  • 実装のクラス階層
    • DisplayImplクラス
    • StringDisplayImplクラス

登場人物

  • Abstraction役(Displayクラス)

    「機能のクラス階層」の最上位であり、Implementor役のメソッドを使って基本的な機能だけを記述する。

  • RefinedAbstraction役(CountDisplayクラス)

    Abstraction役に機能を追加する役

  • Implementor役(DisplayImplクラス)

    「実装のクラス階層」の最上位であり、Abstraction役のインターフェースを実装するためのメソッドを規定する。

  • ConcreteImplementor役(StringDisplayImplクラス)

    Implementor役のインターフェースを実装する。

実装のポイント

Displayクラスのコンストラクタには、実装を表すクラスのインスタンスを渡します。 これが2つのクラス階層の橋渡しをしているのです。

また、Displayクラスの3つのクラス(open, print, close)は、 実装を表すクラスに処理を委譲しています。

Abstract Factoryパターンのメリット

Bridgeパターンの特徴は、階層ごとに分けていることです。 これにより、それぞれを独立して拡張することができます。

「継承」は、クラスを拡張する便利な方法だが、クラス間を密結合にしてしまう。 必要に応じて、クラス間の関係を切り替えたい場合、「継承」では、 ソースコードを書き換えなければいけません。 そのような時に、「委譲」を使います。 「委譲」により処理を”たらい回し”することで、クラス間が「継承」に比べて疎結合となります。

疎結合であるので、StringDisplayImplクラス以外のConcreteImplementor役があったとしても、 Mainクラスだけ切り替えの修正を行えば、実装できます。 つまり、疎結合である方が、修正しやすいということです。

まとめ

Bridgeパターンは、機能のクラス階層と実装のクラス階層に分け、それらを委譲によって橋渡しすることによって、 クラス間を疎結合にしている。