Visitor

デザインパターンとは

デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。

Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。

Note

デザインパターンのサンプルコードはSwift4でまとめます。

ビジターパターンとは?

ビジターパターンは処理をVisitorオブジェクトに書き込むことで処理の追加が簡単に行えるデザインパターンです、処理とデータを分離するためコードの見通しが良くなります。

受け入れ側(Acceptor)はVisitorを受け入れるacceptメソッドを実装しなければいけません。

サンプルコード

サンプルでは釣りをVisitorパターンに落とし込んで考えました。

Visitorは魚Acceptorは釣り人です。

Visitor

Visitorは大きい魚です。この魚はアマチュアプロフェッショナルどちらかの釣り人に釣られます。

protocol FishVisitor {
    func visit(acceptor: Amature);
    func visit(acceptor: Professional);
}

class BigFish: FishVisitor {
    func visit(acceptor: Amature) {
        print("素人だったので逃げることができた")
    }
    func visit(acceptor: Professional) {
        print("プロの手際でクーラーボックスに閉じ込められた")
    }
}

Acceptor

Accepterは釣り人です。acceptメソッドに自分を渡すことでどんな魚が来ても釣り人は同じ対応をすればいいのです。

今回はFishVisitorが大きい魚しかいませんが、もし小さい魚が釣り人の竿に掛かったとしても釣り人は糸を巻けばいいのです。処理は変わりません。釣れるかどうかはVisitor次第です。

protocol AnglerAcceptor {
    func accept(fish: FishVisitor)
}

class Amature: AnglerAcceptor {
    func accept(fish: FishVisitor) {
        fish.visit(acceptor: self)
    }
}

class Professional: AnglerAcceptor {
    func accept(fish: FishVisitor) {
        fish.visit(acceptor: self)
    }
}

呼び出し

Amature().accept(fish: BigFish())
Professional().accept(fish: BigFish())

このように出力されます。

素人だったので逃げることができた
プロの手際でクーラーボックスに閉じ込められた

コード一覧

import UIKit

protocol FishVisitor {
    func visit(acceptor: Amature);
    func visit(acceptor: Professional);
}

class BigFish: FishVisitor {
    func visit(acceptor: Amature) {
        print("素人だったので逃げることができた")
    }
    func visit(acceptor: Professional) {
        print("プロの手際でクーラーボックスに閉じ込められた")
    }
}

protocol AnglerAcceptor {
    func accept(fish: FishVisitor)
}

class Amature: AnglerAcceptor {
    func accept(fish: FishVisitor) {
        fish.visit(acceptor: self)
    }
}

class Professional: AnglerAcceptor {
    func accept(fish: FishVisitor) {
        fish.visit(acceptor: self)
    }
}
Amature().accept(fish: BigFish())
Professional().accept(fish: BigFish())

参考文献

Visitor パターン

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

デザインパターン

前の記事

Memento
デザインパターン

次の記事

Strategy