当前位置: 首页 > news >正文

访问者Visitor

在结构不变的情况下动态改变内部元素的动作

适合用在接口结构基本固定不变的

1616810823325-47c3689f-42fb-45f5-b574-dafaf209506c.png

实现案例

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

应用

http://www.hskmm.com/?act=detail&tid=31215

相关文章:

  • 迭代器模式Iterator
  • WebStorm的安装与使用
  • WinCC Unified必备设置
  • Lexical Feature engineering
  • 面向对象进阶
  • OAuth2.0思维导图总结以及认证平台流程图
  • InCopy 2025安装教程(安装包)IC2025免费版下载安装教程
  • 材料可视化 | Violin Plot小提琴图Python实现 数据分布密度可视化科研图表
  • ApacheMapStruct常用总结
  • 《数学之美》读后感,简单之美——布尔代数和搜索引擎
  • JSON字符串转换为Map
  • fastjson
  • 2025/10/14 模拟赛总结 - sb
  • HEAD以及分离头指针
  • git思维导图总结
  • Python 并发编程:concurrent.futures
  • ZR3365
  • 记一次因对象构造顺序引发的踩内存问题
  • 恒流电路的震荡问题
  • 六维力传感器材质选择:影响性能与精度的关键因素 - 实践
  • C尖笔记
  • 浅谈自学习编程以来学到的代码规范
  • Jenkins Share Library教程 —— 高级实战与最佳实践教程
  • qoj.6555 Sets May be Good 做题记录
  • 结构化数据自动生成文本技术解析
  • CSharp: Aspose.CAD 25.10 Convert DWG and DXF to PDF
  • vtk学习——Pipeline
  • 长沙四大名校x东方project
  • Rust 的英文数字验证码识别系统设计与实现
  • IOS开发 - UIViewController 界面控制基类解析