访问者模式

1 概念

1 定义

  • 它允许在不改变已有对象结构的情况下,定义对这些对象的新操作。

  • 有两个核心角色:

    • 访问者(Visitor):定义了可以对各种对象结构中元素进行的操作。它抽象出了可以对不同对象执行的操作,并通过不同的具体访问者来实现具体的操作逻辑。
    • 元素(Element):定义了一个接受访问者的方法,使得访问者可以访问它的内部状态。元素可以是单个对象,也可以是对象的集合。
  • 类型 : 行为型

2 应用场景

  • 需要对对象结构中的元素进行多种不相关或不一致的操作,而不希望在元素类中增加这些操作的情况。
  • 需要对不同类型的元素执行不同的操作,而又不希望使用条件语句或类型判断来实现的情况。

3 优缺点

优点:

  • 增加新的操作很容易 , 只需要增加一个新的访问者即可

缺点:

  • 增加 新 数据结构比较困难

  • 元素变更比较困难 ; 如为被访问的对象增加 / 减少一些属性 , 相应的访问者也需要进行修改

2 代码实现

场景:课程分为免费课程和VIP课程 , 用户分为 免费用户 和 VIP用户 ;不同的用户 , 访问不同的课程 , 各自有不同的效果 ;

1
2
3
4
5
6
7
8
9
10
@Data
public abstract class Course {
private String name;

/**
* 当有访问者要访问课程时 , 将访问者传入该方法
* 用于判定访问者是否有权限访问课程
*/
public abstract void accept(IVisitor visitor);
}
1
2
3
4
5
6
7
8
public class FreeCourse extends Course {

// 免费课程,接受访问者,来判断访问者是否有权限访问课程
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
1
2
3
4
5
6
7
8
9
10
@Data
public class VIPCourse extends Course {
private int price;

// VIP课程,接受访问者,来判断访问者是否有权限访问课程
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
1
2
3
4
5
// 访问者接口, 封装多个Course的访问方式
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(VIPCourse VIPCourse);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class VIPVisitor implements IVisitor {

//访问免费课程,打印所有免费课程名称
@Override
public void visit(FreeCourse freeCourse) {
System.out.println("我是 VIP, 可以访问:免费课程:"+freeCourse.getName());
}

//访问VIP课程,打印所有VIP课程名称及价格
@Override
public void visit(VIPCourse VIPCourse) {
System.out.println("我是 VIP ,可以访问VIP课程:"+ VIPCourse.getName()+" 价格:"+ VIPCourse.getPrice()+"元");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test {
public static void main(String[] args) {
List<Course> courseList = new ArrayList<Course>();

FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("SpringMVC数据绑定");

VIPCourse VIPCourse = new VIPCourse();
VIPCourse.setName("Java设计模式精讲");
VIPCourse.setPrice(299);

courseList.add(freeCourse);
courseList.add(VIPCourse);

for(Course course : courseList){
course.accept(new VIPVisitor());
}
}
}

输出:

我是 VIP, 可以访问:免费课程:SpringMVC数据绑定
我是 VIP ,可以访问VIP课程:Java设计模式精讲 价格:299元


访问者模式
http://example.com/访问者模式/
作者
Panyurou
发布于
2023年10月4日
许可协议