访问者模式将操作和操作的对象结构分开,允许有新的操作而不更改结构类;
访问者模式在单个类中定义一组操作,他为每个类型的对象定义一个方法,该方法是来自它必须操作的结构。只需要添加一个访问者就可以添加一组新操作
2.角色- Element:元素,对象结构(后面会说)的基类
- ConcreteElementA/ConcreteElementB:具体的元素 ,外部操作的具体类
- Visitor:基类,它声明了对ConcreteElement 的具体操作
- ConcreteVisitor :访问者基类的实现。当需要一组单独的操作室,只需要创建一个访问者;
xml文档解析器设计
编译器的设计 语法的解析
复杂集合对象的处理
复杂集合对象的处理
4.1 对象结构&Element,ConcreteElementA对象结构
//对象结构
public class Computer {
ComputerPart cpu = new CPU();
ComputerPart memory = new Memory();
ComputerPart board = new Board();
//接受不同的Visitor
public void acccept(Visitor v) {
this.cpu.accept(v);
this.memory.accept(v);
this.board.accept(v);
}
}
abstract class ComputerPart {
abstract void accept(Visitor v);
abstract double getPrice();
}
class CPU extends ComputerPart {
@Override
void accept(Visitor v) {
v.visitCpu(this);
}
@Override
double getPrice() {
return 500;
}
}
class Memory extends ComputerPart {
@Override
void accept(Visitor v) {
v.visitMemory(this);
}
@Override
double getPrice() {
return 300;
}
}
class Board extends ComputerPart {
@Override
void accept(Visitor v) {
v.visitBoard(this);
}
@Override
double getPrice() {
return 200;
}
}
4.2Visitor ConcreteVisitor
interface Visitor {
void visitCpu(CPU cpu);
void visitMemory(Memory memory);
void visitBoard(Board board);
}
// 每一个 Visitor 的实现都是对固定结构的具体操作
class PersonelVisitor implements Visitor {
double totalPrice = 0.0;
@Override
public void visitCpu(CPU cpu) {
totalPrice += cpu.getPrice() * 0.9;
}
@Override
public void visitMemory(Memory memory) {
totalPrice += memory.getPrice() * 0.85;
}
@Override
public void visitBoard(Board board) {
totalPrice += board.getPrice() * 0.95;
}
}
class CorpVisitor implements Visitor {
double totalPrice = 0.0;
@Override
public void visitCpu(CPU cpu) {
totalPrice += cpu.getPrice() * 0.6;
}
@Override
public void visitMemory(Memory memory) {
totalPrice += memory.getPrice() * 0.75;
}
@Override
public void visitBoard(Board board) {
totalPrice += board.getPrice() * 0.75;
}
}
4.3 测试
public static void main(String[] args) {
PersonelVisitor p = new PersonelVisitor();//或者 CorpVisitor
new Computer().acccept(p);
System.out.println(p.totalPrice);
}
4.4总结
不同的Persone 可以使用不同 PersonelVisitor 的实现来实现Computer 对象的构建;而没有对Computer结构修改 ;



