1. 程式人生 > >設計模式系列17---深入瞭解的訪問者模式設計模式系列17---深入瞭解的訪問者模式

設計模式系列17---深入瞭解的訪問者模式設計模式系列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函式處理不同物件,擴充套件性也不錯。
缺點:暴露一些類的方法,也就是說和這個訪問者很關心 被他遊覽的這個類的內部細節內容,這是和第米特法則有些不合適的,另外當增減屬性時候,我們也需要修改下,這個是挺麻煩的。

參考資料