javaでのMediatorパターン

Mediatorパターンはデザインパターンの一つで、複雑に絡み合ったオブジェクト間の関係をMediator(調停者)が整理するパターンです。
例えば、10個のオブジェクト間で連携を取る必要がある場合、オブジェクト同士で直接連携を取ると、「自分以外の9個のオブジェクトに対する調整処理 × 10個のオブジェクト」で90通りの調整処理が必要になってしまいます。
しかし、調停者のオブジェクトを新たに作成し、その調停者を通して調整することにすれば、「調停者に対する調整処理 ×10個のオブジェクト」で10通りの調整処理で済みます。

ある資源に対して作用するプロセスやボタン等が多い場合に効果を発揮するパターンです。

以下、サンプルコードです。
誰かが実施すれば良い作業に対して、複数の作業者が作業しようとする例です。

【サンプルコード】

・Mediator.java

・ConcreteMediatorA.java

・ConcreteMediatorB.java

・Colleague.java

・ConcreteColleagueA.java

・ConcreteColleagueB.java

・MediatorMain.java

【実行結果】


いかがでしたでしょうか。

今回紹介した Mediatorパターンは、前述の通り複数のオブジェクト間の連携が多い時に効果を発揮するパターンです。
調停者クラスを用意して連携を調整するという発想は、自力ではなかなか思い浮かばないと思います。
そこでこのパターンを頭に入れておけば、オブジェクト間の連携が多く処理が煩雑になりそうな場合に、調停者クラスを定義することで整理するという発想が思い浮かぶようになると思います。

StateパターンやCommandパターンをまだ紹介していませんので、これらのパターンも今後紹介していきたいと思います!

javaでのChainOfResponsibilityパターン

Chain of Responsibilityパターンとは、その名の通り責任が連鎖する構造を表すためのパターンです。
あるオブジェクトで解決できない問題を別のオブジェクトにたらい回すようにするのがツボで、そうすることで解決できなかった場合の処理を簡略化できます。

ソースコードを見た方が理解が早いと思うので、いつも通りサンプルコードを示したいと思います。
某有名RPGを模した例で、3匹の味方モンスターが色々な敵モンスターと戦い、その結果を表示するというサンプルコードです。
(なお、今回のサンプルコードでは、このデザインパターンとは直接関係のないEnumクラスも出てきますが、これは同じ定数が何度も出てくるサンプルであるために簡略化のために使用しているので、「責任をたらい回す」という本質とは関係ありません)

【サンプルコード】

・MonsterAttributeEnum.java

・EnemyMonster.java

・AllyMonster.java

・MonsterBattleMain.java

【実行結果】


いかがでしたでしょうか。

今回紹介した Chain of Responsibilityパターンは、ある要求を処理するオブジェクトが複数存在する場合に適用することで、プログラムの再利用が容易になるというパターンです。
ある業務命令をどの役職の社員で処理するか(一般社員なのか、課長なのか、部長なのか、社長なのか)、あるイベントをどのレベルのメッセージで出力するか(正常なのか、警告なのか、異常なのか)、といった場面で利用すると有効です。

まだ紹介していない便利なデザインパターンとしては、Mediatorパターン、Stateパターン、Commandパターンといったものがあります。
これらのパターンもおいおい紹介していきたいと思います!

javaでのVisitorパターン

Visitorパターンは、Compositeパターンを派生させたパターンであり、入れ物・中身の構造に対して複数の処理を記述する必要がある時に適用します。
Entryクラスとは別にVisitorクラスを作成し、Visitorクラスの方に処理を記述することで、構造と処理を分けることができます。

【サンプルコード】

・Element.java

・Entry.java

・Book.java

・GameSoft.java

・Bag.java

・Visitor.java

・ConcreteNormalVisitor.java

・ConcreteNariVisitor.java

・EntryMain.java

【実行結果】


いかがでしたでしょうか。

今回紹介したデザインパターンは、Compositeパターンの派生のようなパターンです。
ファイルシステムを扱う時等に役に立つのではないかと思うので、Compositeパターンのついでに頭に入れておくと良いと思います。

Chain Of ResponsibilityパターンやMediatorパターン等、立ち振るまいに関するデザインパターンがまだまだあるので、これからも紹介していきたいと思います!

javaでのDecoratorパターン

Decoratorパターンは、その名の通りオブジェクトに次々とデコレート(飾りつけ)をし、機能を追加していくパターンです。
Compositeパターンと同じように再帰的なクラス構成とすることで、冗長性を排除します。

今回は、じゃんけんの手を作成するサンプルコードを作ってみました。
「グー」「チョキ」「パー」といった単純な手も作れますし、これらの手を作成するオブジェクトを何度も呼び出すことで「必殺グーチョキパー」のようなズルい手も作れる、というサンプルコードです。

【サンプルコード】

・Hands.java

・CreateEmptyHands.java

・DecorateHands.java

・DecorateRock.java

・DecorateScissors.java

・DecoratePaper.java

・HandsMain.java

【実行結果】


いかがでしたでしょうか?

Compositeパターンと似たような話ですが、Compositeパターンは構造を再帰的に表現するのに対し、今回のDecoratorパターンは機能を再帰的に表現します。
ディレクトリ構造を扱う等ではない場合、Decoratorパターンの方が出番は多いかもしれません。

紹介したいデザインパターンはあと5パターンぐらいあるので、皆さまもう少しお付き合いください。
では、また次回!

javaでのCompositeパターン

Compositeパターンは、入れ物のクラスと中身のクラスを1つの抽象クラスでまとめ、同一視できるようにするパターンです。
このパターンを取り入れることで、クラスを使う側から見て入れ物のクラスなのか中身のクラスなのかを意識する必要がなくなります。

ファイルシステムの例が多いですが、理解を深めるために今回はあえて別の例を出して説明します。
袋と本・ゲームソフトの例を出して説明します。
単に袋の中に本やゲームソフトを入れるだけでなく、袋が破れないように袋を二重にする(袋の中に袋を入れる)こともありますし、袋の中に本用の袋とゲームソフト用の袋を入れて分類することもあります。
このような場合、Compositeパターンを用いることで、袋でも本・ゲームソフトでも同じように処理することができるようになります。

【サンプルコード】

・Entry.java

・Book.java

・GameSoft.java

・Bag.java

・EntryMain.java

【実行結果】


いかがでしたでしょうか。

今回紹介したデザインパターンは、ファイルシステムを扱う時等に役に立つのではないかと思います。
このような再帰的なパターンを自力で思いつくのは難しいと思うので、デザインパターンから学んでおくのが良いと思います。

これからも、役に立つデザインパターンを紹介していこうと思います!