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

目录

一、访问者模式

二、实现

三、优缺点

四、适用环境

五、小结


一、访问者模式

访问者模式:表示一个作用于某个对象结构中的各个元素的操作。访问者模式让用户可以在不改变各元素的类的前提下定义作用于这些元素的新操作(行为型)。

访问者模式的角色:

  • 抽象访问者:为对象结构中的每一个具体元素声明一个访问操作;
  • 具体访问者:实现了由抽象访问者声明的操作;
  • 抽象元素:用于接受访问者的访问操作;
  • 具体元素:调用访问者的访问方法以便完成对一个元素的操作;
  • 对象结构:对象结构是一个元素集合,用于存放元素对象,并且提供了遍历其内部元素的方法。

二、实现

在src目录下,新建一个visitor文件夹,在该文件夹下新建一个visitor.cj文件和visitor.drawio文件。

类图

跟我一起学“仓颉”设计模式-访问者模式_第1张图片

核心代码

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
}

三、优缺点

优点:

  • 在访问者模式里新增访问操作很简单,无需修改源码,符合开闭原则;
  • 访问者模式将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个元素类中,使类的职责更加清晰;
  • 访问者模式让用户能够在不修改现有元素层次结构的情况下定义作用于该层次结构的操作。

缺点:

  • 在访问者模式中增加新的元素类很困难,需要修改源码,违背开闭原则;
  • 访问者模式破坏了对象的封装性。

四、适用环境

  • 一个对象结构包含多个类型的对象,希望这些对象实施一些依赖其具体类型的操作;
  • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

五、小结

本章为大家详细的介绍了仓颉设计模式中最后一个设计模式访问者模式的内容,下一章,为大家带来访问者模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家!!!

你可能感兴趣的:(跟我一起学“仓颉”设计模式,设计模式,仓颉编程语言,华为,仓颉服务端开发)