Bridgeパターンを使ったクラス設計の具体例を考えてみる

オブジェクト指向のこころ」という本を読んでいて、 第10章のBridgeパターンは使いどころが多そうだな、と思ったので簡単にメモ。
いつか使ってみたい。

前提

今自分が関わっているWEBサービスを模して、以下の3つの要件を持つサービスを考える。

1. 検索導線が複数存在する

あるコンテンツを検索するために、異なる軸で検索できる複数の導線が用意されている。
ここでは例として、以下の2つの導線が存在すると仮定する。

  • 地域から検索(areaSearch)
  • コンテンツの特徴から検索(featureSearch)

2. それぞれの検索導線に2種類のパスが存在する。

それぞれの検索導線は、どの画面から遷移したかによって2種類のパスに分けられる。
例えば、以下のような要件を持っている。

  • A画面から地域検索に遷移したときには「/areaSearch/A/」のパスに遷移
  • B画面から地域検索に遷移したときには「/areaSearch/B/」のパスに遷移

3. それぞれの検索導線で2種類の表示方法(リスト表示 or 地図表示)を選ぶことができる。

画面内にある切替ボタンからリスト表示か地図表示を切り替えることができるというもの。 地図表示への切替は別の画面に遷移するが、遷移したときに、パスに含まれるAもしくはBを引き継ぐものとする。 例として地域検索の場合は以下が要件だとする。

  • A画面から地域検索に遷移したとき
    • リスト表示は「/areaSearch/A/」, 地図表示は「/areaSearch/A/map/」
  • B画面から地域検索に遷移したとき
    • リスト表示は「/areaSearch/B/」, 地図表示は「/areaSearch/B/map/」

Bridgeパターンを使った設計

クラス図

f:id:yuki-ogawa:20170311161309p:plain

何をしているのか

「検索導線」と「パス生成」をクラスに切り分け、継承関係を整理している。
検索導線ごとにifやswitchでパスを切り替える実装の仕方と比べると、パス生成クラスのインターフェースをActionクラスに集約させることで、パスの違いを考慮した実装を1箇所に集めカプセル化できているので、凝集度が高い実装になる。