定义:
目的时封装一些施加于某些数据结构元素之上的操作,一但这些操作需要修改,接受这些操作的数据结构则可以保持不变。
角色:
- 抽象访问者:定义CPU和硬盘的访问(属性)
- 具体访问者:实现访问 硬件类型和运行
- 抽象元素:定义硬件型号,运转,访问 参数(抽象访问者)
- 具体元素:实现CPU和硬盘的抽象方法
- 结构对象:电脑,实例化CUP和硬盘对象,定义访问方法 参数(抽象访问者)
优点:
- 访问者模式使得增加新的操作变得很容易,增加新的操作只需要增加新的访问类。
- 将有关行为集中到一个访问者对象
- 累积状态
缺点:
- 增加新元素变得很困难
- 破坏封装
- 违背了依赖倒置原则
场景:
- 业务需要遍历多个不同对象
- 需要一个对象结构中的对象进行很多不相关的操作,避免操作污染类
实例:访问电脑的硬件
package 访问者模式;
public abstract class Hardware {
//定义硬件
private String type;
public String gettype() {
return this.type;
}
public Hardware(String name) {
this.type = name;
}
public abstract void run();
public abstract void accept(ComputerVisitor computerVisitor); //访问
}
package 访问者模式;
public class CPU extends Hardware{
public CPU(String name) {
super(name);
// TODO 自动生成的构造函数存根
}
@Override
public void run() {
// TODO 自动生成的方法存根
System.out.println("CPU正在运行");
}
@Override
public void accept(ComputerVisitor computerVisitor) {
// TODO 自动生成的方法存根
computerVisitor.vistCPU(this);;
}
}
package 访问者模式;
public class Harddisk extends Hardware{
public Harddisk(String name) {
super(name);
// TODO 自动生成的构造函数存根
}
@Override
public void run() {
// TODO 自动生成的方法存根
System.out.println("硬盘正在运行");
}
@Override
public void accept(ComputerVisitor computerVisitor) {
// TODO 自动生成的方法存根
computerVisitor.vistHarddisk(this);;
}
}
package 访问者模式;
public interface ComputerVisitor {
void vistCPU(CPU cpu);
void vistHarddisk(Harddisk harddisk);
}
package 访问者模式;
public class Type implements ComputerVisitor{
@Override
public void vistCPU(CPU cpu) {
// TODO 自动生成的方法存根
System.out.println("CPU型号:"+cpu.gettype());
}
@Override
public void vistHarddisk(Harddisk harddisk) {
// TODO 自动生成的方法存根
System.out.println("硬盘型号:"+harddisk.gettype());
}
}
package 访问者模式;
public class Run implements ComputerVisitor{
@Override
public void vistCPU(CPU cpu) {
// TODO 自动生成的方法存根
cpu.run();
}
@Override
public void vistHarddisk(Harddisk harddisk) {
// TODO 自动生成的方法存根
harddisk.run();
}
}
package 访问者模式;
public class Computer { //结构对象
private Hardware cpu;
private Hardware harddisk;
public Computer(String cpu,String hardString) {
this.cpu = new CPU(cpu);
this.harddisk = new Harddisk(hardString);
}
public void accept(ComputerVisitor computerVisitor) {
cpu.accept(computerVisitor);
harddisk.accept(computerVisitor);
}
}
package 访问者模式;
public class Main {
public static void main(String []args) {
Computer computer = new Computer("inter i7", "WD~500G");
ComputerVisitor typeVisitor = new Type();
ComputerVisitor runVisitor = new Run();
computer.accept(typeVisitor);
System.out.println("---------");
computer.accept(runVisitor);
}
}
CPU型号:inter i7
硬盘型号:WD~500G
---------
CPU正在运行
硬盘正在运行