设计模式之访问者模式

网友投稿 254 2022-09-23

设计模式之访问者模式

设计思想

下属给领导汇报工作的时候不同的领导关注点不同

代码流程

职工存在accept 方法 把自己传递进去接受某个领导审查。领导审查重载方法根据不同领导关注该他需要关注的属性。

代码

public class Client { 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()); }}// 员工基类public abstract class Staff { public String name; public int kpi;// 员工KPI public Staff(String name) { this.name = name; kpi = new Random().nextInt(10); } // 核心方法,接受Visitor的访问 public abstract void accept(Visitor visitor);}// 工程师public class Engineer extends Staff { public Engineer(String name) { super(name); } @Override public void accept(Visitor visitor) { visitor.visit(this); } // 工程师一年的代码数量 public int getCodeLines() { return new Random().nextInt(10 * 10000); }}// 经理public class Manager extends Staff { public Manager(String name) { super(name); } @Override public void accept(Visitor visitor) { visitor.visit(this); } // 一年做的产品数量 public int getProducts() { return new Random().nextInt(10); }}// 管理基类public interface Visitor { // 访问工程师类型 void visit(Engineer engineer); // 访问经理类型 void visit(Manager manager);}public class CTOVisitor implements Visitor { @Override public void visit(Engineer engineer) { System.out.println("工程师: " + engineer.name + ", 代码行数: " + engineer.getCodeLines()); } @Override public void visit(Manager manager) { System.out.println("经理: " + manager.name + ", 产品数量: " + manager.getProducts()); }}// CEO访问者public class CEOVisitor implements Visitor { @Override public void visit(Engineer engineer) { System.out.println("工程师: " + engineer.name + ", KPI: " + engineer.kpi); } @Override public void visit(Manager manager) { System.out.println("经理: " + manager.name + ", KPI: " + manager.kpi + ", 新产品数量: " + manager.getProducts()); }}// 员工业务报表类public class BusinessReport { private List mStaffs = new LinkedList<>(); public BusinessReport() { mStaffs.add(new Manager("经理-A")); mStaffs.add(new Engineer("工程师-A")); mStaffs.add(new Engineer("工程师-B")); mStaffs.add(new Engineer("工程师-C")); mStaffs.add(new Manager("经理-B")); mStaffs.add(new Engineer("工程师-D")); } /** * 为访问者展示报表 * @param visitor 公司高层,如CEO、CTO */ public void showReport(Visitor visitor) { for (Staff staff : mStaffs) { staff.accept(visitor); } }}public class ReportUtil { public void visit(Staff staff) { if (staff instanceof Manager) { Manager manager = (Manager) staff; System.out.println("经理: " + manager.name + ", KPI: " + manager.kpi + ", 新产品数量: " + manager.getProducts()); } else if (staff instanceof Engineer) { Engineer engineer = (Engineer) staff; System.out.println("工程师: " + engineer.name + ", KPI: " + engineer.kpi); } }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:横店影视城成了香港老戏骨的“养老院”?
下一篇:网络寻路
相关文章

 发表评论

暂时没有评论,来抢沙发吧~