中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中雙重分發與 Visitor模式的示例分析

發布時間:2021-07-15 14:04:33 來源:億速云 閱讀:149 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Java中雙重分發與 Visitor模式的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

雙重分發(Double Dispatch)

什么是雙重分發?

談起面向對象的程序設計時,常說起的面向對象的「多態」,其中關于多態,經常有一個說法是「父類引用指向子類對象」。

這種父類的引用指向子類對象的寫法類似下面這種:

Animal animal = new Dog(); 
animal.bark();

另一種常用的形式是

 public class Keeper { 
  public void say(Animal a) { 
   System.out.println("Animal say"); 
  } 
  public void say(Dog dog) { 
   System.out.println("dog say"); 
  } 
} 
Animal animal = new Animal(); 
Animal dog = new Dog(); 
Keeper keeper = new Keeper(); 
keeper.say(animal); 
keep.say(dog);

那上面的keeper調用兩次say的時候,會輸出什么內容呢?會調用到兩個不同的方法嗎?

實際上在這兩次調用的時候,都會調用到say(Animal a)這個方法。由于這些內容在編譯期就能確實下來,這就是 Java 的 靜態分發。

Java中雙重分發與 Visitor模式的示例分析 

從上面的圖我們看到,對于兩次調用生成的字節碼,確實都指向了say(Animal a)這個方法,運行時直接執行方法,輸出了對應的內容。

那對應的animal.bark() 為什么最終會調用到 dog 類的方法?這是在運行時確定具體的方法接收者的類型并執行。這就是所謂的動態分發,在運行時確定具體的方法,實現面向對象的多態。

分發(Dispatch)

分發就是指最終確定一個要執行的方法的過程。

對于 Java 等靜態語言來說,都是通過 單一分發(Single Dispatch)來進行的方法執行。
比如這樣一行代碼

dog.eat(new Bone())

最終執行要選擇的eat方法,只會根據dog的具體類型選擇到對應的方法,而傳入的參數并不能影響到對應方法的選擇,這種就是 single Dispatch

為了讓傳入的真實參數,這里就是Bone來真正起到作用,就需要用到Double Dispatch或者叫做Multiple Dispatch

也就是說最終決定調用方法是哪一個的,不僅僅是方法的接收者,還受參數類型的決定。

Visitor 模式

在GoF 的設計模式中,Visitor 模式就使用到了Double Dispatch 達到了調用真實對象的目的。

對于Visitor 模式,最常用的例子是樹的遍歷。比如在處理到節點和樹葉時的方式有區別,此歸通過 visitor 的雙重分發,實現對于不同的 Element ,執行不同的內容。

代碼類似這樣:

node.accept(new ConcreateVisitor()); 
leaf.accept(new ConcreateVisitor());

node 中的 accept方法,會將自己的真實類型再次傳遞回visitor

public void accept(Visitor v) { 
 v.visit(this); 
}

此時,在visitor中,就能根據真實的類型來調用具體的方法,對應node 和 leaf 分別有類似這樣的方法:

public void visit(Node n); 
public void visit(Leaf l);

Visitor 總結起來一般是包含 visitor 接口,在visitor 接口中,包含各個即將被訪問的 Element對象的處理邏輯。在 各個Element 的具體實現中,再將自己的類型傳遞回visitor 進行二次分發,實現確切邏輯的調用。
在Tomcat中的應用

Visitor 在Tomcat中也有應用,典型的是解析EL表達式。

比如org.apache.el.parser.Node

這個類中包含一個accept(NodeVisitor visitor)方法

實際的 Node 類型有很多,但在真實調用的這個時候,會通過

public void accept(NodeVisitor visitor) throws Exception { 
  visitor.visit(this);

將真實類型傳回visitor, vistor中會調用具體的方法,從而實現參數也能起到決定作用的功能。

public void visit(Node node) throws ELException { 
  if (node instanceof AstFunction) { 
   AstFunction funcNode = (AstFunction) node; 
   Method m = null; 
 
   } else if (xxx) { 
 }

這里一般會聲明多個visit方法,然后上面的visit(this)會直接定位到目標方法上。

關于“Java中雙重分發與 Visitor模式的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上林县| 新干县| 武威市| 逊克县| 化德县| 贡山| 县级市| 加查县| 通山县| 桓台县| 永嘉县| 龙胜| 远安县| 张掖市| 松阳县| 安顺市| 娱乐| 瑞安市| 西华县| 思茅市| 民乐县| 肥乡县| 翼城县| 乐清市| 广丰县| 泰州市| 秭归县| 颍上县| 元氏县| 江达县| 旺苍县| 珠海市| 灵璧县| 徐水县| 仲巴县| 松滋市| 台东县| 南岸区| 顺平县| 蒙山县| 巴林右旗|