定义作用于对象元素的新操作。访问者模式将数据结构和对数据的操作分离开来,使得操作集合可以独立变化,同时也方便添加新的操作。
访问者模式的核心是访问者(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 ↗
总之,学习访问者模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对访问者模式的理解和应用。