visitor pattern
オブジェクト構造上の要素で実行されるオペレーションを表現する。
結果
pros
オブジェクト構造に対して新しいオペレーションを追加しやすい
構造に対するオペレーションをビジターに閉じ込め、構造の要素のクラスを汚さない
cons
構造に新しい要素を加えることを難しくする。
構造の要素のクラスがビジターが働くのに十分なインターフェイスを後悔する必要がある。
これはカプセル化を緩くせざるをえないケースがある。
example
protocol EquipmentVisitorElementProtocol {
func accept(visitor: EquipmentVisitorProtocol)
}
class Cable: EquipmentVisitorElementProtocol {
func Accept(visitor: EquipmentVisitorElementProtocol) {
visitor.visitCable(cable: self)
}
}
class Part: EquipmentVisitorElementProtocol {
func Accept(visitor: EquipmentVisitorElementProtocol) {
visitor.visit(part: self)
}
}
protocol EquipmentVisitorProtocol {
func visitCable(cable: Cable)
func visitPart(part: Part)
}
class PriceEquipmentVisitor: EquipmentVisitorProtocol {
private var price: Int
func visitCable(cable: Cable) {
self.totalPrice += cable.price
}
func visitPart(part: Part) {
self.totalPrice += part.specialPrice
}
}