《JAVA與模式》之訪問者模式


在閻宏博士的《JAVA與模式》一書中開頭是這樣描述訪問者(Visitor)模式的:

  訪問者模式是對象的行為模式。訪問者模式的目的是封裝一些施加於某種數據結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數據結構則可以保持不變。

 1 interface Service {
 2 
 3     public void accept(Visitor visitor);
 4 }
 5 
 6 class Visitor {
 7 
 8     public void process(Service service) {
 9         // 基本業務
10         System.out.println("基本業務");
11     }
12 
13     public void process(Saving service) {
14         // 存款
15         System.out.println("存款");
16     }
17 
18     public void process(Draw service) {
19         // 提款
20         System.out.println("提款");
21     }
22 
23     public void process(Fund service) {
24         System.out.println("基金");
25         // 基金
26     }
27 
28 }
29 
30 class Saving implements Service {
31 
32     public void accept(Visitor visitor) {
33         visitor.process(this);
34 
35     }
36 }
37 
38 class Draw implements Service {
39 
40     public void accept(Visitor visitor) {
41         visitor.process(this);
42 
43     }
44 }
45 
46 class Fund implements Service {
47 
48     public void accept(Visitor visitor) {
49         visitor.process(this);
50 
51     }
52 }

從上面例子可以看出,訪問者借助的是java的動態分配機制,使得visitor可以順利的執行相應對象的方法

 1 // 正常邏輯實現
 2 
 3         Service service1 = new Saving();
 4         Service service2 = new Fund();
 5         Service service3 = new Draw();
 6         List<Service> ls = new ArrayList<Service>();
 7         ls.add(service1);
 8         ls.add(service2);
 9         ls.add(service3);
10         for (Service service : ls) {
11             if (service instanceof Saving) {
12                 System.out.println("存款");
13             } else if (service instanceof Fund) {
14                 System.out.println("基金");
15             } else if (service instanceof Draw) {
16                 System.out.println("提款");
17             }
18         }
19         //上述的問題是隨着業務量增大 代碼維護量會非常的大 需要不斷的去判斷 
20         
21         //采用訪問者模式解決
22         Service saving = new Saving();
23         Service fund = new Fund();
24         Service draw = new Draw();
25         Visitor visitor = new Visitor();
26         saving.accept(visitor);
27         fund.accept(visitor);
28         draw.accept(visitor);
29         //上述中accept中實際上有觀察者的影子 實際上 訪問者我們也可以理解成一個對業務熟悉的觀察者
30         //他不斷觀察者是否有新的業務需求 有的話 進行相應的業務處理

小結:

采用Visitor的好處如上面說到的那樣,當需要改變其中一項業務的處理時,不需要每個地方都進行修改,而只需要改動Visitor類中相應的處理函數就可以了。也就是說它適合於業務處理時常發生變動的情況。 

當然,Visitor也有它自身的限制。它不適合於業務數量的經常變化,因為一旦新增或刪除一些Service時,需要對visitor進行相應的增刪。也就是說具體Service與Visitor是耦合的

其實也是將責任抽象成一個個具體的類,從而避免在一個類中既處理邏輯又帶有功能,違反了面向對象原則--責任單一

參考:

http://men4661273.iteye.com/blog/1635167

http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM