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