一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Java 的雙重分發與 Visitor 模式實例詳解

Java 的雙重分發與 Visitor 模式實例詳解

2021-05-13 12:14侯樹成 Java教程

這篇文章主要介紹了Java 的雙重分發與 Visitor 模式實例詳解,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

雙重分發(double dispatch)

什么是雙重分發?

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

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

?
1
2
animal animal = new dog();
animal.bark();

另一種常用的形式是

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 ,執行不同的內容。

代碼類似這樣:

?
1
2
node.accept(new concreatevisitor());
leaf.accept(new concreatevisitor());

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

?
1
2
3
public void accept(visitor v) {
 v.visit(this);
}

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

?
1
2
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 類型有很多,但在真實調用的這個時候,會通過

?
1
2
public void accept(nodevisitor visitor) throws exception {
  visitor.visit(this);

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

?
1
2
3
4
5
6
7
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這種模式通過模式的形式來實現雙重分發的效果。希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

原文鏈接:http://zhuanlan.51cto.com/art/201807/578177.htm

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99精品久久精品一区二区小说 | 肉大捧一进一出视频免费播放 | 国产日本欧美亚洲精品视 | 欧美摸胸 | 国产成人性色视频 | 交换性关系中文字幕6 | 午夜影院c绿象 | 欧美一区二区三区四区在线观看 | 国产99久久久国产精品成人 | 毛片网在线观看 | 天天操婷婷 | 国产男人搡女人免费视频 | 欧美一区二区三区精品影视 | 视频精品一区二区三区 | 免费视频片在线观看大片 | 免费超级乱淫视频播放性 | 欧美一区不卡二区不卡三区 | 国产乱子伦在线观看不卡 | 激性欧美激情在线aa | 闺蜜高h| 毛片的网站 | 美女被扒开屁股进去网 | 色中色软件 | 99精品偷自拍 | 亚洲 欧美 中文 日韩 另类 | 动漫精品午夜在线播放 | 無码一区中文字幕少妇熟女网站 | 爽好舒服把腿张小说 | 精品福利一区 | 国产精品一区二区国产 | 我与么公激情性完整视频 | 精品国产国产综合精品 | 男人的j插入女人的p | 国产精品资源站 | 99精品视频一区在线观看miya | 免费国产成人α片 | 喜马拉雅听书免费版 | 扒开老师两片湿漉的肉 | 亚洲午夜久久久久久91 | 婷婷色在线播放 | 嫩草影院精品视频在线观看 |