目录
一、访问者模式
二、实现
三、优缺点
四、适用环境
五、小结
访问者模式:表示一个作用于某个对象结构中的各个元素的操作。访问者模式让用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作(行为型)。
访问者模式的角色:
在src目录下,新建一个visitor文件夹,在该文件夹下新建一个visitor.cj文件和visitor.drawio文件。
类图
核心代码
package DesignPattern.visitor
import std.collection.*
// 抽象元素
public interface Element {
func accept(visitor: Visitor): Unit
}
// 具体元素A
public class ConcreteElementA <: Element {
public override func accept(visitor: Visitor) {
visitor.visitConcreteElementA(this)
}
public func operationA() {
println("具体元素A 的操作")
}
}
// 具体元素B
public class ConcreteElementB <: Element {
public override func accept(visitor: Visitor) {
visitor.visitConcreteElementB(this)
}
public func operationB() {
println("具体元素B 的操作")
}
}
// 抽象访问者
public interface Visitor {
func visitConcreteElementA(element: ConcreteElementA): Unit
func visitConcreteElementB(element: ConcreteElementB): Unit
}
// 具体访问者1
public class ConcreteVisitor1 <: Visitor {
public override func visitConcreteElementA(element: ConcreteElementA) {
println("具体访问者1 访问 具体元素A")
element.operationA()
}
public override func visitConcreteElementB(element: ConcreteElementB) {
println("具体访问者1 访问 具体元素B")
element.operationB()
}
}
// 具体访问者2
public class ConcreteVisitor2 <: Visitor {
public override func visitConcreteElementA(element: ConcreteElementA) {
println("具体访问者2 访问 具体元素A")
element.operationA()
}
public override func visitConcreteElementB(element: ConcreteElementB) {
println("具体访问者2 访问 具体元素B")
element.operationB()
}
}
public class ElementList {
private let elements: ArrayList = ArrayList()
public func addElement(element: Element) {
elements.append(element)
}
public func accept(visitor: Visitor) {
for (element in this.elements) {
element.accept(visitor)
}
}
}
测试代码
package DesignPattern
import DesignPattern.visitor.*
main(): Int64 {
let elementList = ElementList()
elementList.addElement(ConcreteElementA())
elementList.addElement(ConcreteElementB())
elementList.accept(ConcreteVisitor1())
println()
elementList.accept(ConcreteVisitor2())
return 0
}
优点:
缺点:
本章为大家详细的介绍了仓颉设计模式中最后一个设计模式访问者模式的内容,下一章,为大家带来访问者模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家!!!