访问者模式(Visitor Pattern)提供了Visitor类,作用于某对象的各个类型(子类)的操作,实现了在不改变这些类型的情况下,可以生成对这些类型的新操作。
一、需求举例:
访问者类访问物理机,虚拟机和Docker。
二、类图:
三、代码实例:
1.机器父类:Machine
package com.lance.visitor;
public interface Machine {
void accept(MachineVisitor machineVisitor);
}
2.机器访问者类:MachineVisitor
package com.lance.visitor;
public interface MachineVisitor {
void visit(PhysicalMachine physicalMachine);
void visit(VirtualMachine virtualMachine);
void visit(DockerMachine dockerMachine);
}
3.物理机类:PhysicalMachine
package com.lance.visitor;
public class PhysicalMachine implements Machine {
@Override
public void accept(MachineVisitor machineVisitor) {
machineVisitor.visit(this);
}
}
4.虚拟机类:
package com.lance.visitor;
public class VirtualMachine implements Machine {
@Override
public void accept(MachineVisitor machineVisitor) {
machineVisitor.visit(this);
}
}
5.Docker机器类:
package com.lance.visitor;
public class DockerMachine implements Machine {
@Override
public void accept(MachineVisitor machineVisitor) {
machineVisitor.visit(this);
}
}
6.机器访问者实现类:MachineVisitorImpl
package com.lance.visitor;
public class MachineVisitorImpl implements MachineVisitor {
@Override
public void visit(PhysicalMachine physicalMachine) {
System.out.println("visit physical machine.");
}
@Override
public void visit(VirtualMachine virtualMachine) {
System.out.println("visit virtual machine.");
}
@Override
public void visit(DockerMachine dockerMachine) {
System.out.println("visit docker machine.");
}
}
7.机器访问者实现类2:
package com.lance.visitor;
public class MachineVisitorImpl2 implements MachineVisitor {
@Override
public void visit(PhysicalMachine physicalMachine) {
System.out.println("visit physical machine[2].");
}
@Override
public void visit(VirtualMachine virtualMachine) {
System.out.println("visit virtual machine[2].");
}
@Override
public void visit(DockerMachine dockerMachine) {
System.out.println("visit docker machine[2].");
}
}
8.机器结构类:
package com.lance.visitor;
import java.util.ArrayList;
import java.util.List;
public class MachineStructure {
private List<Machine> machines = new ArrayList<>();
public void addMachine(Machine machine) {
machines.add(machine);
}
public void accept(MachineVisitor machineVisitor) {
for(Machine machine:machines) {
machine.accept(machineVisitor);
}
}
}
9.主类:VisitorPattern
package com.lance.visitor;
public class VisitorPattern {
public static void main(String[] args) {
System.out.println("==========start==========");
MachineStructure machineStructure = new MachineStructure();
machineStructure.addMachine(new PhysicalMachine());
machineStructure.addMachine(new VirtualMachine());
machineStructure.addMachine(new DockerMachine());
MachineVisitor machineVisitor = new MachineVisitorImpl();
machineStructure.accept(machineVisitor);
System.out.println("=======================");
MachineStructure machineStructure2 = new MachineStructure();
machineStructure2.addMachine(new PhysicalMachine());
machineStructure2.addMachine(new VirtualMachine());
machineStructure2.addMachine(new DockerMachine());
MachineVisitor machineVisitor2 = new MachineVisitorImpl2();
machineStructure2.accept(machineVisitor2);
System.out.println("==========end==========");
}
}
输出结果:
==========start==========
visit physical machine.
visit virtual machine.
visit docker machine.
=======================
visit physical machine[2].
visit virtual machine[2].
visit docker machine[2].
==========end==========
网友评论