概念:
访问者模式:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the class of the elements on which it operations. 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
实现:
定义数据结构
public class Computer { public Computer(CPU cpu,HardDisk hardDisk){ this.cpu = cpu; this.hardDisk = hardDisk; } public void accept(ComputerVisitor visitor){ cpu.accept(visitor); hardDisk.accept(visitor); } private CPU cpu; private HardDisk hardDisk; public CPU getCpu() { return cpu; } public void setCpu(CPU cpu) { this.cpu = cpu; } public HardDisk getHardDisk() { return hardDisk; } public void setHardDisk(HardDisk hardDisk) { this.hardDisk = hardDisk; } }
抽象访问对象
public abstract class Hardware { private String name; public Hardware(String name){ this.name = name; } public void run(){ System.out.println(this.name+"运行了"); } public abstract void accept(ComputerVisitor visitor); public String getName() { return name; } public void setName(String name) { this.name = name; } }
访问对象的具体实现
public class CPU extends Hardware { public CPU(String name) { super(name); } @Override public void accept(ComputerVisitor visitor) { visitor.visitor(this); } } public class HardDisk extends Hardware { public HardDisk(String name){ super(name); } @Override public void accept(ComputerVisitor visitor) { visitor.visitor(this); } }
定义访问者接口
public interface ComputerVisitor { void visitor(Hardware hardware); }
访问者具体实现
public class NameVisitor implements ComputerVisitor { @Override public void visitor(Hardware hardware) { System.out.println("访问者访问Name:" + hardware.getName()); } } public class RunVisitor implements ComputerVisitor { @Override public void visitor(Hardware hardware) { hardware.run(); } }
分析:
1.访问者模式可以将一组相关的访问封装在一起,对于新的属性或者行为可以比较容易的扩展访问者。
2.访问者提供的访问方式不通过原数据结构,所以新增加原数据结构对象,导致新增加访问者对象较为复杂。
3.适用场景:
a.有一组固定的运行流程可以使用访问者对其封装。
b.业务规则需要比便利多个不同对象的某些方法,也是可以用访问者模式封装。