访问者模式是一种结构型设计模式,允许将操作添加到对象上,而不改变其类的结构。在访问者模式中,我们可以定义一个访问者接口,然后根据需要添加多个实现该接口的类,每个实现类都对应于一种特定的操作。,,如果我们有一个Person
类和一个PrintPerson
类,我们可以使用访问者模式来为Person
类添加打印功能。我们可以创建一个PrintVisitor
类,它有一个方法Person
对象作为参数,并调用其PrintVisitor
子类,分别对应于打印姓名和打印年龄的操作。
本文目录导读:
概述
在面向对象编程中,设计模式是解决特定问题的一种标准方法,访问者模式(Visitor Pattern)是一种常用的设计模式,它允许你以不同的方式处理一组对象,这种模式通常用于将一个对象结构转换为另一个结构,将一个类的对象转换为另一个类的对象。
基本概念
1、目标类:定义了操作的接口和行为。
2、访问者类:实现了访问操作,可以对目标对象进行操作。
3、被访问者类:实现了访问操作,可以对访问者进行操作。
4、客户端:创建访问者对象并调用其访问操作。
实现步骤
步骤一:定义访问者接口
创建一个访问者接口,包含所有需要的操作,这些操作将被实现在具体的访问者类中。
public interface Visitor { void visit(Object obj); }
步骤二:实现具体访问者类
为每种需要的操作创建一个具体访问者类,这个类将实现visit
方法,并在该方法中对目标对象执行相应的操作。
public class ConcreteVisitorA implements Visitor { @Override public void visit(Object obj) { // 对于访问者A的操作 System.out.println("ConcreteVisitorA visited " + obj); } } public class ConcreteVisitorB implements Visitor { @Override public void visit(Object obj) { // 对于访问者B的操作 System.out.println("ConcreteVisitorB visited " + obj); } }
步骤三:定义被访问者类
创建一个被访问者类,该类实现了访问者的接口,这个类将包含一个列表,用于存储访问者实例。
public class ConcreteSubject { private List<Visitor> visitors = new ArrayList<>(); public void registerVisitor(Visitor visitor) { visitors.add(visitor); } public void unregisterVisitor(Visitor visitor) { visitors.remove(visitor); } public void accept(Object obj) { for (Visitor visitor : visitors) { visitor.visit(obj); } } }
步骤四:客户端代码
客户端代码创建访问者对象,并调用其visit
方法,客户端代码也可以注册和注销访问者。
public class Client { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteVisitorA a = new ConcreteVisitorA(); ConcreteVisitorB b = new ConcreteVisitorB(); subject.registerVisitor(a); subject.registerVisitor(b); subject.accept(new Object()); // 输出:ConcreteVisitorA visited <Object> subject.unregisterVisitor(a); // 输出:ConcreteVisitorA not found in the list subject.accept(new Object()); // 输出:ConcreteVisitorB visited <Object> } }
示例
假设我们有一个Person
类,我们希望将其转换为Student
和Teacher
两种类型,我们可以定义以下访问者:
StudentVisitor
:用于处理Student
类型的转换。
TeacherVisitor
:用于处理Teacher
类型的转换。
Person
:定义了一个接受访问者的方法。
public class Person { public void accept(Visitor visitor) { visitor.visit(this); } }
客户端代码如下:
public class Client { public static void main(String[] args) { Person person = new Person(); person.accept(new StudentVisitor()); person.accept(new TeacherVisitor()); } }
运行结果:
StudentVisitor visited <Student> TeacherVisitor visited <Teacher>