今回はVisitorパターンについて書いていきます。
デザインパターンとは
デザインパターンとはソフトウェア開発の設計方法の事です。
『オブジェクト指向における再利用のためのデザインパターン』という本が出典で、全部で23種類のパターンが紹介されています。
Visitorパターンとは
Visitorパターンとは2種類の側面があり、処理とデータを分離する事と一連の動作を整理できる事ができるデザインパターンです。
Visitor
というインターフェースとAcceptor
というクラス2つがあり、それぞれをベースにしたクラスで構成されます。
SwiftでのVisitorパターンの実装方法
Acceptor
は下の通りです。
これがデータを持つクラスです。
データ以外にaccept
と言うメソッドがあり、そこにVisitor
クラスを渡してvisit
を呼び出しています。
class Acceptor { func accept(visitor: Visitor) {} } class Acceptor1: Acceptor { let name = "Name" override func accept(visitor: Visitor) { visitor.visit(self) } } class Acceptor2: Acceptor { let value = 1 override func accept(visitor: Visitor) { visitor.visit(self) } }
Visitor
プロトコルは下の通りです。
各Acceptor
クラスに対するvisit
メソッドが定義されており、その中に処理を書いています。
visit
の中で他Acceptor
のaccept
メソッドを呼び出す事もあります。
protocol Visitor { func visit(acceptor: Acceptor1); func visit(acceptor: Acceptor2); } class Visitor1: Visitor { func visit(acceptor: Acceptor1) { print("Visitor1がacceptor1へ訪問") } func visit(acceptor: Acceptor2) { print("Visitor1がacceptor2へ訪問") Acceptor1().accept(self) } } class Visitor2: Visitor { func visit(acceptor: Acceptor1) { print("Visitor2がacceptor1へ訪問") } func visit(acceptor: Acceptor2) { print("Visitor2がacceptor2へ訪問") Acceptor1().accept(self) } }
使い方は下の通りです。
Acceptor
インスタンスのaccept
メソッドにVisitor
インスタンスを渡します。
Acceptor2().accept(Visitor2())
まとめ
これはなかなか手ごわいデザインパターンでした。
accept
メソッド経由でvisit
を呼び出す所が少し混乱しました、直接visit
呼ぶのはダメなのかが未だに分かっていません。
- 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 1999/10
- メディア: 単行本
- 購入: 21人 クリック: 711回
- この商品を含むブログ (210件) を見る