访问者模式

简介: 定义作用于对象元素的新操作。访问者模式将数据结构和对数据的操作分离开来,使得操作集合可以独立变化,同时也方便添加新的操作。

定义作用于对象元素的新操作。访问者模式将数据结构和对数据的操作分离开来,使得操作集合可以独立变化,同时也方便添加新的操作。

访问者模式的核心是访问者(Visitor)和被访问元素(Element)。访问者定义了对元素进行操作的接口,而被访问元素定义了接受访问者访问的接口。

访问者模式的使用场景是:当一个数据结构中包含多种类型的元素,并且需要对这些元素进行不同的操作时,可以考虑使用访问者模式。

下面是一个简单的访问者模式的Demo,假设有一个数据结构包含了三种不同类型的元素:圆形、矩形和三角形,他们都可以被访问者访问并执行不同的操作。

python
Copy

访问者接口

class Visitor:
def visit_circle(self, circle):
pass

def visit_rectangle(self, rectangle):
    pass

def visit_triangle(self, triangle):
    pass

圆形类

class Circle:
def accept(self, visitor):
visitor.visit_circle(self)

矩形类

class Rectangle:
def accept(self, visitor):
visitor.visit_rectangle(self)

三角形类

class Triangle:
def accept(self, visitor):
visitor.visit_triangle(self)

具体访问者1

class ConcreteVisitor1(Visitor):
def visit_circle(self, circle):
print("ConcreteVisitor1 访问圆形")

def visit_rectangle(self, rectangle):
    print("ConcreteVisitor1 访问矩形")

def visit_triangle(self, triangle):
    print("ConcreteVisitor1 访问三角形")

具体访问者2

class ConcreteVisitor2(Visitor):
def visit_circle(self, circle):
print("ConcreteVisitor2 访问圆形")

def visit_rectangle(self, rectangle):
    print("ConcreteVisitor2 访问矩形")

def visit_triangle(self, triangle):
    print("ConcreteVisitor2 访问三角形")

客户端代码

circle = Circle()
rectangle = Rectangle()
triangle = Triangle()

visitor1 = ConcreteVisitor1()
visitor2 = ConcreteVisitor2()

circle.accept(visitor1)
rectangle.accept(visitor1)
triangle.accept(visitor1)

circle.accept(visitor2)
rectangle.accept(visitor2)
triangle.accept(visitor2)
这个Demo中,Visitor是访问者接口,定义了对不同元素的访问操作。Circle、Rectangle和Triangle是被访问元素,它们都实现了accept方法,接受访问者的访问,并将自己作为参数传递给访问者的对应方法。ConcreteVisitor1和ConcreteVisitor2是具体的访问者实现,它们分别实现了对每种元素的不同访问操作。

当客户端使用访问者模式时,只需要创建具体的被访问元素和访问者实现,然后将被访问元素作为参数传递给访问者的访问方法即可。通过访问者模式,可以方便地在不改变被访问元素的结构的前提下,增加新的访问操作。

以下是一些推荐的学习资料和链接,可以帮助你更好地学习访问者模式:

《设计模式:可复用面向对象软件的基础》:这是设计模式的经典著作之一,其中包含了对访问者模式的详细讲解和示例代码。
《Head First设计模式》:这是一本非常通俗易懂的设计模式入门书籍,其中也包含了对访问者模式的讲解和示例代码。
《图解设计模式:以UML为基础,学习23种设计模式》:这是一本以图解为主的设计模式入门书籍,其中包含了对访问者模式的详细讲解和示例代码。
访问者模式的Java实现:这是一个包含了访问者模式示例代码的Java项目,可以帮助读者更好地理解和应用访问者模式。
GitHub链接:https://github.com/iluwatar/java-design-patterns/tree/master/visitor
总之,学习访问者模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对访问者模式的理解和应用。

目录
相关文章
|
2月前
|
设计模式 编译器 C#
访问者模式
访问者模式是一种行为型设计模式,用于将数据结构与其操作解耦。通过在不改变数据结构的前提下增加新的操作,访问者模式提供了一种灵活的方式来实现功能扩展。其关键特性包括分离操作、支持扩展和双分派机制。适用于需要对对象结构中的元素执行多种操作、频繁扩展操作以及不希望操作逻辑和数据结构耦合的场景。常见的使用案例包括编译器中的语法树、文件系统和游戏场景。优点是增加操作时无需修改数据结构,符合开闭原则;缺点是添加新的数据结构类型时需要修改所有访问者类,维护成本较高。
53 3
|
6月前
|
设计模式 Java
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
访问者模式问题之在不使用访问者模式的情况下,怎么在一个 SelectNode 类中实现 extractFunctions 方法
|
设计模式 算法
行为型设计模式11-访问者模式
行为型设计模式11-访问者模式
59 1
|
9月前
|
算法
行为型 访问者模式
行为型 访问者模式
67 0
|
9月前
|
设计模式 uml C++
行为型 迭代器模式
行为型 迭代器模式
51 0
|
设计模式 Java 关系型数据库
访问者模式解读
访问者模式解读
今天说说你不知道的访问者模式
今天说说你不知道的访问者模式
87 0
|
设计模式 程序员
访问者模式是啥?咋实现呀?
访问者模式是啥?咋实现呀?
|
设计模式
我学会了,访问者模式
访问者模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
127 0
我学会了,访问者模式
观察者模式和访问者模式(1)
观察者模式和访问者模式(1)
217 0
观察者模式和访问者模式(1)