目录
- 一、 啥是访问者模式?
- 二、 为什么要用访问者模式?
- 三、 访问者模式的实现方式
- 四、 访问者模式的优缺点
- 五、 访问者模式的应用场景
- 六、 总结
我的其他文章也讲解的比较有趣,如果喜欢博主的讲解方式,可以多多支持一下,感谢!
了解迭代器模式请看: (二 十)趣学设计模式 之 迭代器模式!
✨更多请看个人主页: 码熔burning
这篇文章带你详细认识一下设计模式中的访问者模式
想象一下,你每年都要去医院做一次体检 。 体检的项目有很多,比如量血压、验血、做心电图等等 。 不同的医生负责不同的检查项目,比如内科医生负责量血压,化验师负责验血 。
访问者模式,就是表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作! 简单来说,就是把对对象的操作从对象本身分离出来,放到访问者中去执行 ⚕️。
简单来说,就是让不同的“医生(访问者)”来“检查(访问)”你的“身体(元素)”,并执行不同的检查项目! ⚕️+
用访问者模式,好处多多 :
访问者模式主要包含以下几个角色:
代码示例:
// 访问者接口:医生
public interface Doctor {
void visit(BodyPartA bodyPartA); // 检查身体部位 A
void visit(BodyPartB bodyPartB); // 检查身体部位 B
}
// 具体访问者:内科医生
public class InternalMedicineDoctor implements Doctor {
@Override
public void visit(BodyPartA bodyPartA) {
System.out.println("内科医生检查 " + bodyPartA.getName() + ":量血压");
}
@Override
public void visit(BodyPartB bodyPartB) {
System.out.println("内科医生检查 " + bodyPartB.getName() + ":听诊");
}
}
// 具体访问者:化验师
public class LabTechnician implements Doctor {
@Override
public void visit(BodyPartA bodyPartA) {
System.out.println("化验师检查 " + bodyPartA.getName() + ":验血");
}
@Override
public void visit(BodyPartB bodyPartB) {
System.out.println("化验师检查 " + bodyPartB.getName() + ":验尿");
}
}
// 元素接口:身体部位
public interface BodyPart {
String getName();
void accept(Doctor doctor); // 接受医生
}
// 具体元素:手臂
public class BodyPartA implements BodyPart {
@Override
public String getName() {
return "手臂";
}
@Override
public void accept(Doctor doctor) {
doctor.visit(this); // 接受医生,并将自身传递给医生
}
}
// 具体元素:心脏
public class BodyPartB implements BodyPart {
@Override
public String getName() {
return "心脏";
}
@Override
public void accept(Doctor doctor doctor) {
doctor.visit(this); // 接受医生,并将自身传递给医生
}
}
// 对象结构:身体
public class Body {
private List<BodyPart> bodyParts = new ArrayList<>();
public void add(BodyPart bodyPart) {
bodyParts.add(bodyPart);
}
public void remove(BodyPart bodyPart) {
bodyParts.remove(bodyPart);
}
public void accept(Doctor doctor) {
for (BodyPart bodyPart : bodyParts) {
bodyPart.accept(doctor); // 让每个身体部位接受医生
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Body body = new Body(); // 创建身体对象
body.add(new BodyPartA()); // 添加手臂
body.add(new BodyPartB()); // 添加心脏
Doctor internalMedicineDoctor = new InternalMedicineDoctor(); // 创建内科医生
Doctor labTechnician = new LabTechnician(); // 创建化验师
body.accept(internalMedicineDoctor); // 让内科医生检查身体
body.accept(labTechnician); // 让化验师检查身体
}
}
分析:
Doctor
是访问者接口,定义了访问不同身体部位的 visit
方法。InternalMedicineDoctor
和 LabTechnician
是具体访问者,分别实现了内科医生和化验师的检查逻辑。BodyPart
是元素接口,定义了 accept
方法,用于接受医生。BodyPartA
和 BodyPartB
是具体元素,分别代表手臂和心脏,实现了 accept
方法,将自身传递给医生。Body
是对象结构,包含了所有的身体部位,并提供了 accept
方法,让每个身体部位接受医生。输出结果:
内科医生检查 手臂:量血压
内科医生检查 心脏:听诊
化验师检查 手臂:验血
化验师检查 心脏:验尿
优点:
缺点:
希望这个例子能让你彻底理解访问者模式! 祝你学习愉快!