Bridge パターン

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Bridgeパターンから転送)

Bridge パターン(ブリッジ・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 「橋渡し」のクラスを用意することによって、クラスを複数の方向に拡張させることを目的とする。

クラス図[編集]

Bridge パターンのクラス図を以下に挙げる。

クラス Abstraction は Implementor 型の属性を持ち、操作 function() を実装する。抽象クラス Implementor は操作 implementation() を実装する。Abstraction#function() ではメンバの Implementor の implementation() が実行される。
クラス Abstraction は Implementor 型の属性を持ち、操作 function() を実装する。抽象クラス Implementor は操作 implementation() を実装する。Abstraction#function() ではメンバの Implementor の implementation() が実行される。

利用例[編集]

Bridge パターンの適用が望ましいクラス構造は、例えば以下のようなものである。

Dishware (食器)を継承したクラスに Plate (皿)と Bowl (ボウル)があり、さらにそれらの派生クラスとして WoodenPlate, GlassPlate, WoodenBowl, GlassBowl が存在する
Dishware (食器)を継承したクラスに Plate (皿)と Bowl (ボウル)があり、さらにそれらの派生クラスとして WoodenPlate, GlassPlate, WoodenBowl, GlassBowl が存在する

この例では、まず Dishware(食器)クラスから Plate(皿)と Bowl(ボウル)クラスが派生している。 さらに、Plate からは WoodenPlate(木製の皿)と GlassPlate(ガラス製の皿)が、 Bowl からは WoodenBowl(木製のボウル)と GlassBowl(ガラス製のボウル)が派生している。

このクラス階層は、以下に挙げる問題をはらんでいる。

  • クラスの追加が困難である。仮にプラスチック製の食器を新たにサポートしようとする場合、Plate クラスと Bowl クラスのそれぞれを継承しなければならない。あるいは Dishware クラスのサブクラスとして例えば Cup クラスを追加する場合、WoodenCup や GlassCup を同時に作成しなければならない。
  • コードの複製が発生する。例に挙げた WoodenPlate と WoodenBowl, GlassPlate と GlassBowl はそれぞれ同じ材質の食器であるため、内部的に似たような性質を持っているかもしれない。しかしながら、継承関係の都合上これらのクラスはすべて個別に定義しなければならず、結果として同じようなコードを別途に記述しなければならなくなる。

この問題が起こる理由は、クラス階層の中に複数の継承関係が混在していることである。 上の例において、Dishware と Plate および Bowl の関係は、食器の種類による継承関係とみなすことができ、 一方で Plate と WoodenPlate および GlassPlate の関係は、食器の材質による継承関係とみなすことができる。 このように複数の継承関係が存在することにより、一つの継承関係が他の継承関係に悪影響を及ぼすことになる。

このクラス構造は、Bridge パターンを適用することによって以下のように改善することができる。

Dishware を継承したクラスに Plate と Bowl がある。Dishware は材質に関する情報を Material クラスに委譲する。Material の派生クラスに Wood と Glass がある。
Dishware を継承したクラスに Plate と Bowl がある。Dishware は材質に関する情報を Material クラスに委譲する。Material の派生クラスに Wood と Glass がある。

このクラス図では Dishware から派生する継承関係は食器の種類のみであり、材質に関する情報は Material(素材)クラスに委譲している。 この構造により、種類と材質はそれぞれ独立して拡張することができ、クラスの数も減らすことが出来る。

関連項目[編集]