模式简介:
将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不扭转数据结构的前提下能够增加作用于这些元素的新的操作,为数据结构中的每个元素提供多种拜访形式。它将对数据的操作与数据结构进行拆散,是行为类模式中最简单的一种模式。
在现实生活中,有些汇合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和解决形式。例如,咱们如果一台电脑由CPU,内存,主板形成,去电脑城配电脑,店家须要依据不同的顾客对这三个商品打折,比方集体配电脑(CPU九折,内存八折,主板七折)、企业批量购买电脑(CPU,内存,主板统统七折);又比方这个访问者模式在Java生成动静代理(ASM)中的利用比拟宽泛,这个呢我是个菜菜,就不细究了
那么这些被解决的元素绝对稳固而拜访形式多种多样,如果用“访问者模式”来解决比拟不便。访问者模式能把解决办法从数据结构中分离出来,并能够依据须要减少新的解决办法,且不必批改原来的程序代码,这进步了程序的扩展性和灵活性。
应用场景:
一个构造当中的元素多样并且比较稳定,每一种元素的拜访形式多种多样
模式构造:
访问者模式蕴含以下次要角色。
- 形象访问者(Visitor)角色:定义一个拜访具体元素的接口,为每个具体元素类对应一个拜访操作 visit() ,该操作中的参数类型标识了被拜访的具体元素。
- 具体访问者(PersonelVisitor、CorpVisitor)角色:实现形象访问者角色中申明的各个拜访操作,确定访问者拜访一个元素时该做什么。
- 形象元素(ComputerPart)角色:申明一个蕴含承受操作 accept() 的接口,被承受的访问者对象作为 accept() 办法的参数。
- 具体元素(CPU、Memory、Board)角色:实现形象元素角色提供的 accept() 操作,其办法体通常都是 visitor.visit(this) ,另外具体元素中可能还蕴含自身业务逻辑的相干操作。
- 对象构造(Computer)角色:是一个蕴含元素角色的容器,提供让访问者对象遍历容器中的所有元素的办法
模式实例:
1. 形象访问者Visitor
interface Visitor{ void visitCpu(CPU cpu); void visitMemory(Memory memory); void visitBoard(Board board);}
2. 具体访问者PersonelVisitor、CorpVisitor
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; }}
3. 形象元素ComputerPart
abstract class ComputerPart{ abstract void accept(Visitor v); abstract double getPrice();}
4. 具体元素CPU、Memory、Board
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; }}
5. 对象构造Computer
public class Computer { ComputerPart cpu = new CPU(); ComputerPart memory = new Memory(); ComputerPart board = new Board(); public void accept(Visitor v){ this.cpu.accept(v); this.memory.accept(v); this.board.accept(v); } public static void main(String[] args) { //CorpVisitor p = new CorpVisitor(); PersonelVisitor p = new PersonelVisitor(); new Computer().accept(p); System.out.println(p.totalPrice); }}