乐趣区

关于java:Visitor-访问者模式

模式简介:

将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不扭转数据结构的前提下能够增加作用于这些元素的新的操作,为数据结构中的每个元素提供多种拜访形式。它将对数据的操作与数据结构进行拆散,是行为类模式中最简单的一种模式。

在现实生活中,有些汇合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和解决形式。例如,咱们如果一台电脑由 CPU, 内存,主板形成,去电脑城配电脑,店家须要依据不同的顾客对这三个商品打折,比方集体配电脑(CPU 九折,内存八折,主板七折)、企业批量购买电脑(CPU,内存,主板统统七折);又比方这个访问者模式在 Java 生成动静代理(ASM)中的利用比拟宽泛,这个呢我是个菜菜,就不细究了

那么这些被解决的元素绝对稳固而拜访形式多种多样,如果用“访问者模式”来解决比拟不便。访问者模式能把解决办法从数据结构中分离出来,并能够依据须要减少新的解决办法,且不必批改原来的程序代码,这进步了程序的扩展性和灵活性。

应用场景:

一个构造当中的元素多样并且比较稳定,每一种元素的拜访形式多种多样

模式构造:

访问者模式蕴含以下次要角色。

  1. 形象访问者(Visitor)角色:定义一个拜访具体元素的接口,为每个具体元素类对应一个拜访操作 visit(),该操作中的参数类型标识了被拜访的具体元素。
  2. 具体访问者(PersonelVisitor、CorpVisitor)角色:实现形象访问者角色中申明的各个拜访操作,确定访问者拜访一个元素时该做什么。
  3. 形象元素(ComputerPart)角色:申明一个蕴含承受操作 accept() 的接口,被承受的访问者对象作为 accept() 办法的参数。
  4. 具体元素(CPU、Memory、Board)角色:实现形象元素角色提供的 accept() 操作,其办法体通常都是 visitor.visit(this),另外具体元素中可能还蕴含自身业务逻辑的相干操作。
  5. 对象构造(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);
 }
}
退出移动版