访问者模式
访问者(Visitor)模式:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。
在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。
案例
设计一台电脑并提供硬件更新功能
硬件:
public abstract class Hardware {String commond;public Hardware(String commond){this.commond = commond;}public abstract void work();public abstract void acceptUpdate(Visitor visitor);
}
public class CPU extends Hardware{public CPU(String commond) {super(commond);}@Overridepublic void work() {System.out.println("cpu正在工作:"+commond);}@Overridepublic void acceptUpdate(Visitor visitor) {visitor.visitedCPU(this);}
}
public class Memery extends Hardware{public Memery(String commond) {super(commond);}@Overridepublic void work() {System.out.println("内存正在工作:"+commond);}@Overridepublic void acceptUpdate(Visitor visitor) {visitor.visitedMem(this);}
}
public class Disk extends Hardware{public Disk(String commond) {super(commond);}@Overridepublic void work() {System.out.println("磁盘正在工作:"+commond);}@Overridepublic void acceptUpdate(Visitor visitor) {visitor.visitedDisk(this);}
}
更新包:
public interface Visitor {void visitedCPU(CPU cpu);void visitedMem(Memery memery);void visitedDisk(Disk disk);
}
public class UpdatePackage implements Visitor{String update;public UpdatePackage(String update){this.update = update;}@Overridepublic void visitedCPU(CPU cpu) {cpu.commond = update;}@Overridepublic void visitedMem(Memery memery) {memery.commond = update;}@Overridepublic void visitedDisk(Disk disk) {disk.commond = update;}
}
电脑:
public class Computer {private CPU cpu;private Memery memery;private Disk disk;public Computer(CPU cpu, Disk disk, Memery memery) {this.cpu = cpu;this.disk = disk;this.memery = memery;}public void work(){cpu.work();memery.work();disk.work();}public void update(Visitor visitor){cpu.acceptUpdate(visitor);memery.acceptUpdate(visitor);disk.acceptUpdate(visitor);}
}
测试:
public class Main {public static void main(String[] args) {Computer computer = new Computer(new CPU("单机模式"),new Disk("单机模式"), new Memery("单机模式"));computer.work();System.out.println("============");computer.update(new UpdatePackage("联网模式"));computer.work();}
}