访问者模式
来源:互联网 发布:萧山网络问政关注 编辑:程序博客网 时间:2024/06/06 22:59
1类图
2定义
封装一些作用与某些数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用与这些元素的新操作。
3应用场景
1 对象结构比较稳定,但经常需要对此对象结构上定义新的操作。
2 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新的操作时修改这些类。
4员工基类
public abstract class Staff { public String name; public int kpi; public Staff(String name){ this.name = name; kpi = new Random().nextInt(10); } public abstract void accept(Visitor visitor);}
5工程师类
public class Engineer extends Staff { public Engineer(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visit(this); } public int getCodeLine(){ return new Random().nextInt(10 * 10000); }}
6经理类
public class Manager extends Staff { public Manager(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visit(this); } public int getProducts(){ return new Random().nextInt(); }}
7员工业务报表1类
public class BusinessReport { List<Staff> list = new ArrayList<>(); public BusinessReport(){ list.add(new Manager("张三")); list.add(new Engineer("工程师-李四")); list.add(new Engineer("工程师-李四1")); list.add(new Engineer("工程师-李四2")); list.add(new Engineer("工程师-李四3")); } public void showReport(Visitor visitor){ for (Staff staff : list) { staff.accept(visitor); } }}
8员工属性接口
public interface Visitor { public void visit(Engineer engineer); public void visit(Manager manager);}
9CEO访问者 关心业绩
public class CEOVisitor implements Visitor { @Override public void visit(Engineer engineer) { // TODO Auto-generated method stub System.out.println(engineer.name + " " + engineer.kpi); } @Override public void visit(Manager manager) { // TODO Auto-generated method stub System.out.println(manager.name + " " + manager.kpi + manager.getProducts()); }}
10分别处理两类员工
public class ReportUitl { public void visitor(Staff staff){ if(staff instanceof Manager){ Manager manager = (Manager) staff; System.out.println(manager.name + " " + manager.kpi + manager.getProducts()); }else { Engineer engineer = (Engineer) staff; System.out.println(engineer.name + " " + engineer.kpi); } }}
11CTO访问者 关心技术
public class CTOVisitor implements Visitor { @Override public void visit(Engineer engineer) { // TODO Auto-generated method stub System.out.println(engineer.name + " " + engineer.kpi + " " + engineer.getCodeLine()); } @Override public void visit(Manager manager) { // TODO Auto-generated method stub System.out.println(manager.name + " " + manager.kpi + manager.getProducts()); }}
12测试类
public static void main(String[] args) { BusinessReport report = new BusinessReport(); System.out.println("======= CEO ========"); report.showReport(new CEOVisitor()); System.out.println("======= CTO ========"); report.showReport(new CTOVisitor()); }
阅读全文
0 0
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- Java程序性能优化 读书笔记(四)设计模式:享元模式
- 《Spring设计思想》AOP设计基本原理
- tanh Function
- java.lang.IllegalStateException: Failed to load ApplicationContext
- 个人总结20
- 访问者模式
- redis
- 类和对象
- Mahmoud and a Dictionary CodeForces
- Matlab中plot、fplot、ezplot的使用方法和区别
- 数据库事务并发带来的问题
- solr管理界面解析
- springMVC 的工作原理
- 谈笑风生线段树(点修改)