Visitor 访问者模式

模式简介:

将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。

在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,我们假如一台电脑由CPU,内存,主板构成,去电脑城配电脑,店家需要根据不同的顾客对这三个商品打折,比如个人配电脑(CPU九折,内存八折,主板七折)、企业批量购买电脑(CPU,内存,主板通通七折);又比如这个访问者模式在Java生成动态代理(ASM)中的应用比较广泛,这个呢我是个菜菜,就不细究了

那么这些被处理的元素相对稳定而访问方式多种多样,如果用“访问者模式”来处理比较方便。访问者模式能把处理方法从数据结构中分离出来,并可以根据需要增加新的处理方法,且不用修改原来的程序代码,这提高了程序的扩展性和灵活性。

使用场景:

一个结构当中的元素多样并且比较稳定,每一种元素的访问方式多种多样

模式结构:

image

访问者模式包含以下主要角色。

  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);
 }
}

你可能感兴趣的:(java)