しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftで学ぶデザインパターン10 (Visitorパターン)

今回は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の中で他Acceptoracceptメソッドを呼び出す事もあります。

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呼ぶのはダメなのかが未だに分かっていません。

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

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