跟我一起学“仓颉”设计模式-访问者模式

发布时间:2026/6/9 14:10:16

跟我一起学“仓颉”设计模式-访问者模式 一、访问者模式访问者模式表示一个作用于某个对象结构中的各个元素的操作。访问者模式让用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作行为型。访问者模式的角色抽象访问者为对象结构中的每一个具体元素声明一个访问操作具体访问者实现了由抽象访问者声明的操作抽象元素用于接受访问者的访问操作具体元素调用访问者的访问方法以便完成对一个元素的操作对象结构对象结构是一个元素集合用于存放元素对象并且提供了遍历其内部元素的方法。二、实现在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: ArrayListElement ArrayListElement() public func addElement(element: Element) { elements.add(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 }三、优缺点优点在访问者模式里新增访问操作很简单无需修改源码符合开闭原则访问者模式将有关元素对象的访问行为集中到一个访问者对象中而不是分散在一个个元素类中使类的职责更加清晰访问者模式让用户能够在不修改现有元素层次结构的情况下定义作用于该层次结构的操作。缺点在访问者模式中增加新的元素类很困难需要修改源码违背开闭原则访问者模式破坏了对象的封装性。四、适用环境一个对象结构包含多个类型的对象希望这些对象实施一些依赖其具体类型的操作对象结构中对象对应的类很少改变但经常需要在此对象结构上定义新的操作。五、小结本章为大家详细的介绍了仓颉设计模式中最后一个设计模式访问者模式的内容下一章为大家带来访问者模式练习题的内容。最后创作不易如果大家觉得我的文章对学习仓颉设计模式有帮助的话就动动小手点个免费的赞吧收到的赞越多我的创作动力也会越大哦谢谢大家

相关新闻