Java设计模式-访问者模式Visitor
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
介绍
- 访问者模式Visitor Pattern封装一些作用于某种数据结构的各元素的操作它可以在不改变数据结构的前 提下定义作用于这些元素的新的操作。
- 主要将数据结构与数据操作分离解决 数据结构和操作耦合性问题
- 访问者模式的基本工作原理是在被访问的类里面加一个对外提供接待访问者的接口
- 访问者模式主要应用场景是需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联)同时需要避免让这些操作"污染"这些对象的类可以选用访问者模式解决。
原理类图
- Visitor 是抽象访问者为该对象结构中的 ConcreteElement 的每一个类声明一个 visit 操作
- ConcreteVisitor 是一个具体的访问值 实现每个有 Visitor 声明的操作是每个操作实现的部分.
- ObjectStructure 能枚举它的元素 可以提供一个高层的接口用来允许访问者访问元素
- Element 定义一个 accept 方法接收一个访问者对象
- ConcreteElement 为具体元素实现了 accept 方法
实战案例
我们将创建一个定义接受操作的ComputerPart接口。键盘、鼠标、监视器和计算机是实现ComputerPart接口的具体类。我们将定义另一个接口ComputerPartVisitor它将定义访问者类操作。计算机用具体的访问者做相应的动作。
我们的演示类VisitorPatternMo将使用Computer和ComputerPartVisitor类来演示访问者模式的使用。
代码实现
- 定义元素接口ComputerPart.java
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
创建具体的元素类实现上面的接口
- Keyboard.java
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
- Monitor.java
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
- Mouse.java
public class Mouse implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
- Computer.java
public class Computer implements ComputerPart {
ComputerPart[] parts;
public Computer(){
parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
- 定义访问者接口ComputerPartVisitor.java
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
定义具体的访问者实现访问者接口。
- ComputerPartDisplayVisitor.java
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Computer computer) {
System.out.println("Displaying Computer.");
}
@Override
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
- 创建示例类VisitorPatternDemo.java用于展示Computer的各个组件
public class VisitorPatternDemo {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
- 输出