我们有巡视组,他的主要工作就是巡视各个地方的一些重要点,看下他们的工作展开情况,整个巡视过程对重点对象深入的调查,如
- 调阅、复制有关文件、档案、会议记录等资料;
- 以适当方式对被巡视地区、单位的下属单位或者部门进行走访调研;
- 听取被巡视地区、单位党委(党组)的工作汇报和有关部门的专题汇报;
除了上面的,还有别的很多内容,所以我们的巡视组可以对被调查对象有深入的了解,如果有猫腻也可以很快的被发现。
那么问题来了,我们该怎么做这样的一个模型呢?
代码实现
现在我们先来抽象个接受调查的类。
假设我们现在先调查的人,而且关注看下他的工资是多少。
public abstract class Employee {
private int money;
public abstract void accept(IVisitor visitor);
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
接着是我们的领导们
public class Leader extends Employee {
private String performance;
public String getPerformance() {
return performance;
}
public void setPerformance(String performance) {
this.performance = performance;
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
要考察是他的政绩如何performance
。
接着巡视的内容还有那个看下他们的秘书,这个是需要聊的对象,我们想知道从秘书的眼里看,这个领导平时是怎么样的。
public class Secretary extends Employee {
private String talk;
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
public String getTalk() {
return talk;
}
public void setTalk(String talk) {
this.talk = talk;
}
}
在我们的人员都准备好后,我们得来看下我们的巡视组的内容了
public class VisitorGroup implements IVisitor {
@Override
public void visit(Leader leader) {
System.out.println(" 同志,你一个月的工资是多少? \n 同志:" + leader.getMoney());
System.out.println(leader.getPerformance());
}
@Override
public void visit(Secretary secretary) {
System.out.println(" 秘书同志,你一个月的工资是多少? \n 同志:" + secretary.getMoney());
System.out.println(secretary.getTalk());
}
}
public interface IVisitor {
public void visit(Leader leader);
public void visit(Secretary secretary);
}
这样我们的巡视组也准备好了,是时候开始干活了
我们来写下我们的测试:
public class Client {
public static void main(String[] args) {
List<Employee> employees = new ArrayList<>();
Leader leader = new Leader();
leader.setMoney(9999999);//一个月的工资嘛,79而已,不多
leader.setPerformance("我为人廉洁,政绩显赫");
employees.add(leader);
Secretary secretary = new Secretary();
secretary.setMoney(200);//一个月就收200
secretary.setTalk("领导为人光明累过,行事正派");
employees.add(secretary);
for (Employee employee : employees) {
employee.accept(new VisitorGroup());
}
}
}
接着我们运行下,看到下面的内容:
同志,你一个月的工资是多少?
同志:9999999
我为人廉洁,政绩显赫
秘书同志,你一个月的工资是多少?
同志:200
领导为人光明累过,行事正派
很好,我们的巡视组已经了解了一些情况。
类图
比较下我们的代码,会发现好像少了一个ObjectStructure
类,他是容纳多个不同类,不同接口的容器,比如List,Set,Map等。我们就用了employees
来做了。没有抽象出来单独成一个类。
后记
对于这个访问者模式,还有很多在个版本,这里就不深入的说了。
优点:访问者是单一职责原则的很好体现,不同的vistor
函数处理不同对象,扩展性也不错。
缺点:暴露一些类的方法,也就是说和这个访问者很关心 被他游览的这个类的内部细节内容,这是和第米特法则有些不合适的,另外当增减属性时候,我们也需要修改下,这个是挺麻烦的。