0-前言
访问者模式(Visitor)定义:
表示一个作用于某对象结构中的各元素的操作。
它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
1-实现
1-1、简单UML图

1-2、代码实现
//1、Visitor父类------------------------------------------abstract class Leader{ public abstract void VisitFinanceReport(FinanceReport financeReport); public abstract void VisitLogisticsReport(LogisticsReport logisticsReport);}//1-1、具体访问者A--财务总监class FinanceLeader extends Leader{ @Override public void VisitFinanceReport(FinanceReport financeReport) { System.out.println("根据财务报表,营业收入为:"+financeReport.getIncome()); } @Override public void VisitLogisticsReport(LogisticsReport logisticsReport) { }}//1-2、具体访问者B--销售总监class LogisticeLeader extends Leader{ @Override public void VisitFinanceReport(FinanceReport financeReport) { } @Override public void VisitLogisticsReport(LogisticsReport logisticsReport) { System.out.println("根据销售报表,销售额为:"+logisticsReport.getSell()); }}//2、元素父类----------------------------------------------------abstract class Report{ public abstract void Accept(Leader leader);}//2-1、元素A--财务报表class FinanceReport extends Report{ public int getIncome() { return 100000; } @Override public void Accept(Leader leader) { leader.VisitFinanceReport(this); }}//2-2、元素B--销售报表class LogisticsReport extends Report{ public int getSell() { return 90000; } @Override public void Accept(Leader leader) { leader.VisitLogisticsReport(this); }}//3、元素结构类--------------------------------------------------class ReportBox{ private List<Report> reports = new ArrayList<>(); //加入报表 public void Add(Report _report) { reports.add(_report); } //删除报表 public void Remove(Report _report) { reports.remove(_report); } //访问方法 public void Accept(Leader leader) { for(Report rp : reports) { rp.Accept(leader); } }
客户端
ReportBox rb=new ReportBox(); //结构 rb.Add(new FinanceReport()); rb.Add(new LogisticsReport()); FinanceLeader fl = new FinanceLeader(); //访问者 LogisticeLeader ll = new LogisticeLeader(); //访问者 rb.Accept(fl); rb.Accept(ll);
运行结果

2、应用场景简单总结
1、当一个对象结构包含很多类对象,希望对这些对象实施一些依赖于其具体类的操作时;
2、当对象结构被很多应用共享时;
无废话设计模式(19)行为模式立刻网、 出口电商冲刺黑五 营销攻略分享会、 2020年亚马逊广告运营实操课、 看2019年欧洲服装色系新变化,找准选品新方向、 频陷合同纠纷案,明星创业公司蜂巢供应链破产、 美国返校季即将来临,亚马逊Prime Day却推迟了,跨境卖家们太难了!、 怎么去羊城创意产业园?、 荷包岛在哪里的?荷包岛有什么好玩的?、 八角寨好玩?、