[Go言語]Chain of Responsibilityパターンを学ぼう! ~Method Chain編~

こんにちは、KOUKIです。

この記事では、デザインパターンの一つであるChain of Responsibilityパターンについて紹介します。

ちなみに、このパターンのMethod Chainについては、活用方法が思い浮かばなかったので、シチュエーションは書いてないです^^;

ただ、頭の体操にはなります!

デザインパターンまとめ

Chain of Responsibilityパターンの適用

chain は「鎖」、responsibility は「責任」を意味します。故に、Chain of Responsibility パターンとは、「責任」を負ったものが、「鎖」状につながれた状態をイメージさせるパターンです

Method Chainは、繋がれたインスタンスのメソッドを再起的に呼び出すことを可能にします。

と、言葉で説明してもわかりにくいと思うので、プログラムを実装しながら理解していきましょう^^

ロガーの定義

ロガーを例にサンプルコードを実装していきます。

このお手製のロガーに、Method Chainで機能を追加していきます。

インターフェース

インターフェースを定義します。ここではまだ意味がわからなくても問題ありません。

つなぎ構造体

メソッドを繋げるための繋ぎ構造体を作成します。

つなぎ構造体のAddメソッド

インターフェースを実装するために、Addメソッドを実装します。

ここは、大切なポイントです。
Addは、オブジェクトを繋げるためのメソッドになります。

nextパラメータが空の場合は、パラメータとして渡した値(m)を格納します。このmは、Modifierインターフェースを満たすインスタンスです。

また、nextパラメータが空でない場合は、mを引数にAddメソッドを再帰的に呼び出して、同じ処理を繰り返します。

こうすることで、インスタンスを繋げているわけですね。

また、nextの型はModifierインターフェース型であり、AddとHandlerをメソッドとして実装した構造体のインスタンスを渡すことができます。

豆知識ですが、他の構造体(SampleModifier)のパラメータにインターフェースを実装した構造体(LoggerModifier)を指定し、インスタンス化したものもnextに渡すことができます。

つなぎ構造体のHandleメソッド

インターフェースを実装するために、Handleメソッドを実装します。

ここも大切なポイントです。
Handleメソッドは、連なった処理を実行するためのメソッドになります。

ロガーレベル構造体

ロガーレベルごとに構造体を作成しましょう。

各構造体には、Add/Handlerメソッドを実装したLoggerModifer構造体を持ちます。

ロガーレベル構造体のHandleメソッド

ここでは、各インスタンスが行いたい処理を個別に実装します。

使ってみよう

ここまで実装したロガーを使ってみましょう。

この様に、つなぎ構造体を作成してから、Addメソッドにロガーレベル構造体を渡していきます。そして、最後にHandleメソッドで処理を実行します。

クリアロガー

Handleメソッドにより、ロガーメソッドの呼び出しが可能になりますが、逆に呼び出さないメソッドも実装可能です。

Handleの中身を空にすることで、鎖を断ち切った感じですね。

OKですね。

まとめ

今回は、実用的というよりも頭の体操に近いコードサンプルでしたね。もしかしたらロガーを例にしたのが、悪かったのかもしれません^^;

InterfaceとStructをうまく組み合わせて、再帰的な処理を作り出すこの方法は結構面白いと思います。

しかし、実務への導入は検討する必要がありそうです。少し読みにくくなりそうですし、そもそも使うシチュエーションが思い浮かばないというか。。

どんな時にこのパターンは、使えるんでしょうね?

プログラミングのスキルが上がれば、わかってくるかもしれません。知識として覚えておこうと思います!

次回

次回は、ResponsibilityパターンのBroker Chainです。お楽しみに!

Go言語まとめ

ソースコード

コメントを残す