概念
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
参考链接: 访问者模式 | 菜鸟教程
代码案例
电脑部件接口-接收电脑部件访问者
/**
* 电脑部件接口
*/
public interface ComputerPart {
public String accept(ComputerPartVisitor computerPartVisitor);
}
电脑部件访问者接口,提供四个部件访问
/**
* 访问者接口
*/
public interface ComputerPartVisitor {
String visit(Computer computer);
String visit(Mouse mouse);
String visit(Keyboard keyboard);
String visit(Monitor monitor);
}
电脑部件实现类
鼠标
/**
* 鼠标
*/
public class Mouse implements ComputerPart {
@Override
public String accept(ComputerPartVisitor computerPartVisitor) {
return computerPartVisitor.visit(this);
}
}
显示器
/**
* 显示器
*/
public class Monitor implements ComputerPart {
@Override
public String accept(ComputerPartVisitor computerPartVisitor) {
return computerPartVisitor.visit(this);
}
}
键盘
/**
* 键盘
*/
public class Keyboard implements ComputerPart {
@Override
public String accept(ComputerPartVisitor computerPartVisitor) {
return computerPartVisitor.visit(this);
}
}
电脑
/**
* 电脑 统一访问入口
*/
public class Computer implements ComputerPart {
ComputerPart[] computerParts;
public Computer() {
computerParts = new ComputerPart[]{new Monitor(),new Mouse(),new Keyboard()};
}
@Override
public String accept(ComputerPartVisitor computerPartVisitor) {
for (ComputerPart computerPart : computerParts) {
computerPart.accept(computerPartVisitor);
}
return computerPartVisitor.visit(this);
}
}
电脑部件访问实现类
/**
* 电脑部件访问实现类
*/
@Slf4j
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public String visit(Computer computer) {
log.info("访问电脑---");
return "Displaying Computer.";
}
@Override
public String visit(Mouse mouse) {
log.info("访问电脑鼠标---");
return "Displaying Mouse.";
}
@Override
public String visit(Keyboard keyboard) {
log.info("访问电脑键盘---");
return "Displaying Keyboard.";
}
@Override
public String visit(Monitor monitor) {
log.info("访问电脑显示器---");
return "Displaying Monitor.";
}
}
测试主类
/**
* 设计模式控制器
*/
@RestController
@RequestMapping("/designPattern")
@Slf4j
public class DesignController {
@Autowired
private ApplicationContext applicationContext;
@GetMapping("/visitor")
public ResponseModel visitor() throws Exception {
log.info("visitor ---- start ");
Computer computer= new Computer();
ComputerPartDisplayVisitor computerPartDisplayVisitor = new ComputerPartDisplayVisitor();
computer.accept(computerPartDisplayVisitor);
log.info("visitor ---- end ");
return new ResponseModel("访问者模式完成", 200, null);
}
}
测试案例
2022-07-02 18:36:44.306 INFO visitor ---- start 【http-nio-8081-exec-2】【DesignController:88】
2022-07-02 18:36:53.528 INFO 访问电脑显示器--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:28】
2022-07-02 18:36:53.537 INFO 访问电脑鼠标--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:16】
2022-07-02 18:36:53.539 INFO 访问电脑键盘--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:22】
2022-07-02 18:36:53.541 INFO 访问电脑--- 【http-nio-8081-exec-2】【ComputerPartDisplayVisitor:10】
2022-07-02 18:36:57.802 INFO visitor ---- end 【http-nio-8081-exec-2】【DesignController:94】