[Go言語]Visitorパターンを学ぼう!

こんにちは、KOUKIです。

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

デザインパターンまとめ

シチュエーション

Visitor は、「訪問者」を意味する英単語で、Visitor パターンは、既存のコードを変更せずに既存のクラス階層に新しい処理を追加できるパターンです。

Go言語にはクラスという概念がないので、Struct(構造体)が対象になると思います。

Visitorパターンの適用

サンプルとして、顔文字v(^ – ^ )vを生成するプログラムをVisitorパターンで実装してみましょう。

Visitorインターフェース

まず、Visitorが持つ共通のインターフェースを実装しましょう。

Visitorの実装

次にVisitorを実装します。

これらは、すべてShowメソッドを持ちます。Showメソッドの中身は同じなので、本来であれば構造体を分ける必要はないのかもしれませんが、「既存のコードを変更せずに既存のクラス階層に新しい処理を追加できる」を示すために、構造体を分けています。

ポイントは、Expressionインターフェースを満たすために、Showメソッドを実装していることです。

訪問先構造体

訪問先の構造体を実装しましょう。

この構造体のパラメータの型は、Expressionインターフェースです。つまり、Showメソッドを実装した構造体ならなんでも渡せます。

これにより、新しいVisitorを実装することで、構造体の振る舞いを変更せずに追加の処理を実装できるという訳です。

インターフェースは、本当に便利です。

使ってみよう

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

ご覧の通り、CombineExpressionを軸に、階層的にインスタンスを追加していけます。

実行します。

OKですね。

Showメソッドの統合

インターフェースにShowメソッドを持たせないで、統合する方法もあります。

構造体毎に用意していたShowメソッドを一つの関数に統合しました。こちらの方が修正そうですね。

プログラムを実行してみましょう。

おわりに

このパターンは、インターフェースの活用が肝ですね。

インターフェースの活用方法については、次の記事にまとめたので、よかったら参考にしてください。

次回

次回も引き続き、Visitorパターンを学習しましょう!

Go言語まとめ

ソースコード

Ver1

Ver2

コメントを残す