栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式-行为型模式-访问者模式 Visitor

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式-行为型模式-访问者模式 Visitor

设计模式-行为型模式-访问者模式 Visitor 1.简介

访问者模式将操作和操作的对象结构分开,允许有新的操作而不更改结构类;

访问者模式在单个类中定义一组操作,他为每个类型的对象定义一个方法,该方法是来自它必须操作的结构。只需要添加一个访问者就可以添加一组新操作

2.角色

  • Element:元素,对象结构(后面会说)的基类
  • ConcreteElementA/ConcreteElementB:具体的元素 ,外部操作的具体类
  • Visitor:基类,它声明了对ConcreteElement 的具体操作
  • ConcreteVisitor :访问者基类的实现。当需要一组单独的操作室,只需要创建一个访问者;
3.场景

xml文档解析器设计
编译器的设计 语法的解析
复杂集合对象的处理

4.代理例子

复杂集合对象的处理

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结构修改 ;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号