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