在结构不变的情况下动态改变内部元素的动作
适合用在接口结构基本固定不变的
实现案例
package com.deltaqin.designPattern.d04_visitor;// 根据不同的访问者访问的不同商品,给不同的价格
// 计算的规则定义在访问者上面,不同访问者对从商品获得的相同的信息实现自己的逻辑
// 同一个被访问者传递给不同访问者的消息是一样的。
public class Computer {ComputerPart cpu = new CPU();ComputerPart memory = new Memory();ComputerPart board = new Board();public void acccept(Visitor v) {this.cpu.accept(v);this.memory.accept(v);this.board.accept(v);}public static void main(String[] args) {//将访问者传递给被访问者,被访问者根据访问者接口调用他的visit方法,并且传递自己的对象////访问者收到传递过来的被访问者,在visitA内部会调用被访问者的方法以及属性得到属于自己的结果PersonelVisitor p = new PersonelVisitor();new Computer().acccept(p);System.out.println(p.totalPrice);}
}abstract class ComputerPart {abstract void accept(Visitor v);//some other operations eg:getName getBrandabstract double getPrice();
}class CPU extends ComputerPart {@Overridevoid accept(Visitor v) {v.visitCpu(this);}@Overridedouble getPrice() {return 500;}
}class Memory extends ComputerPart {@Overridevoid accept(Visitor v) {v.visitMemory(this);}@Overridedouble getPrice() {return 300;}
}class Board extends ComputerPart {@Overridevoid accept(Visitor v) {v.visitBoard(this);}@Overridedouble getPrice() {return 200;}
}interface Visitor {void visitCpu(CPU cpu);void visitMemory(Memory memory);void visitBoard(Board board);
}class PersonelVisitor implements Visitor {double totalPrice = 0.0;@Overridepublic void visitCpu(CPU cpu) {totalPrice += cpu.getPrice()*0.9;}@Overridepublic void visitMemory(Memory memory) {totalPrice += memory.getPrice()*0.85;}@Overridepublic void visitBoard(Board board) {totalPrice += board.getPrice()*0.95;}
}class CorpVisitor implements Visitor {double totalPrice = 0.0;@Overridepublic void visitCpu(CPU cpu) {totalPrice += cpu.getPrice()*0.6;}@Overridepublic void visitMemory(Memory memory) {totalPrice += memory.getPrice()*0.75;}@Overridepublic void visitBoard(Board board) {totalPrice += board.getPrice()*0.75;}
}