MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

C++によるデザインパターン13: Visitor パターン

増補改訂版 Java言語で学ぶデザインパターン入門

増補改訂版 Java言語で学ぶデザインパターン入門

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン

  • 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 1999/10
  • メディア: 単行本
  • 購入: 21人 クリック: 711回
  • この商品を含むブログ (212件) を見る


Visitor パターン

Visitorパターンは、

データ構造とそのデータに対する処理を分ける

デザインパターンです。


データ構造のクラスと、

そのデータに対する処理のクラスを分け、

お互いが自分のオブジェクトのポインタを渡しあうことで、

データを処理します。

このような処理の方法をダブルディスパッチといいます。

ダブルディスパッチ - Wikipedia


データ処理のクラスのオブジェクトが、

それぞれのデータを渡り歩いて処理をする様子から

Visitorパターンと言われています。


このパターンを利用することで、

機能追加する際にはデータ処理クラスのみを変更すればよく、

データ構造のクラスは変更しなくて良くなります。


今回のサンプルコードは

以前のCompositeパターンのサンプルコードを使用し、

Visitorパターンでディレクトリツリーの

ファイル構成を表示する機能を実装しました。

C++によるデザインパターン11: Composite パターン - MY ENIGMA


Compositeパターンのサンプルコードと比較すると、

DirectoryとFileクラスをほとんど変更せずに、

処理を追加できていることがわかります。


しかし、このVisitorパターンを使用すると、

VisitorクラスにEntryの中身を公開する必要があるため

データのカプセル性が劣化してしまうことが、

個人的には欠点だと思います。


C++によるサンプルコード

下記のGitHubページにて公開しています。

cpp/Visitor.cpp at master - AtsushiSakai/cpp