设计模式系列17---深入了解的访问者模式

enter image description here

我们有巡视组,他的主要工作就是巡视各个地方的一些重要点,看下他们的工作展开情况,整个巡视过程对重点对象深入的调查,如

  • 调阅、复制有关文件、档案、会议记录等资料;
  • 以适当方式对被巡视地区、单位的下属单位或者部门进行走访调研;
  • 听取被巡视地区、单位党委(党组)的工作汇报和有关部门的专题汇报;

除了上面的,还有别的很多内容,所以我们的巡视组可以对被调查对象有深入的了解,如果有猫腻也可以很快的被发现。

那么问题来了,我们该怎么做这样的一个模型呢?

代码实现

现在我们先来抽象个接受调查的类。
假设我们现在先调查的人,而且关注看下他的工资是多少。

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
领导为人光明累过,行事正派

很好,我们的巡视组已经了解了一些情况。


类图

enter image description here

比较下我们的代码,会发现好像少了一个ObjectStructure类,他是容纳多个不同类,不同接口的容器,比如List,Set,Map等。我们就用了employees来做了。没有抽象出来单独成一个类。

后记

对于这个访问者模式,还有很多在个版本,这里就不深入的说了。

优点:访问者是单一职责原则的很好体现,不同的vistor函数处理不同对象,扩展性也不错。
缺点:暴露一些类的方法,也就是说和这个访问者很关心 被他游览的这个类的内部细节内容,这是和第米特法则有些不合适的,另外当增减属性时候,我们也需要修改下,这个是挺麻烦的。

参考资料

中央巡视工作领导小组

热评文章