模式 / 行为模式
image

interface Element {
    fun accept(v: CarVisitor)
}

//ConcreteElement
class EngineElement {
    override fun accept(v: CarVisitor) {
        v.visit(this)
    }
}

//ConcreteElement
class Wheel(private val number: Int): Element {

    fun getNumber(): Int {
        return number
    }

    override fun accept(v: CarVisitor) {
        v.visit(this)
    }
}

//ConcreteElement
class CarElement {
    private val items = arrayOf(
        Engine(),
        Wheel(1), Wheel(2),
        Wheel(3), Wheel(4)
    )

    override fun accept(v: CarVisitor) {
        for (e in items) {
            e.accept(v)
        }
        v.visit(this)
    }
}

//Visitor
interface CarVisitor {
    fun visit(engine: Engine)
    fun visit(wheel: Wheel)
    fun visit(car: Car)
}

//ConcreteVisitor
class TestCarVisitorCarVisitor {
    override fun visit(engine: Engine) {
        println("test engine")
    }

    override fun visit(wheel: Wheel) {
        println("test wheel #" +
            wheel.getNumber())
    }

    override fun visit(car: Car) {
        println("test car")
    }
}

//ConcreteVisitor
class RepairCarVisitorCarVisitor {
    override fun visit(engine: Engine) {
        println("repair engine")
    }

    override fun visit(wheel: Wheel) {
        println("repair wheel #" +
            wheel.getNumber())
    }

    override fun visit(car: Car) {
        println("repair car")
    }
}

//Client
val car = Car()
val v1 = TestCarVisitor()
val v2 = RepairCarVisitor()

car.accept(v1)
car.accept(v2)