訪問者模式

定義

在訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類坷牛,它改變了元素類的執(zhí)行算法罕偎。通過這種方式,元素的執(zhí)行算法可以隨著訪問者改變而改變京闰。這種類型的設(shè)計模式屬于行為型模式颜及。根據(jù)模式,元素對象已接受訪問者對象蹂楣,這樣訪問者對象就可以處理元素對象上的操作俏站。

實現(xiàn)

我們將創(chuàng)建一個定義接受操作的 ComputerPart 接口。Keyboard痊土、Mouse肄扎、MonitorComputer 是實現(xiàn)了 ComputerPart接口的實體類。我們將定義另一個接口 ComputerPartVisitor赁酝,它定義了訪問者類的操作犯祠。Computer 使用實體訪問者來執(zhí)行相應(yīng)的動作。
VisitorPatternDemo酌呆,我們的演示類使用 Computer衡载、ComputerPartVisitor 類來演示訪問者模式的用法。

訪問者模式的 UML 圖

步驟 1
定義一個表示元素的接口隙袁。
ComputerPart.java
public interface ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}
步驟 2
創(chuàng)建擴展了上述類的實體類痰娱。
Keyboard.java
public class Keyboard  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}
Monitor.java
public class Monitor  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}
Mouse.java
public class Mouse  implements ComputerPart {

   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      computerPartVisitor.visit(this);
   }
}
Computer.java
public class Computer implements ComputerPart {
    
   ComputerPart[] parts;

   public Computer(){
      parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};      
   } 


   @Override
   public void accept(ComputerPartVisitor computerPartVisitor) {
      for (int i = 0; i < parts.length; i++) {
         parts[i].accept(computerPartVisitor);
      }
      computerPartVisitor.visit(this);
   }
}
步驟 3
定義一個表示訪問者的接口弃榨。
ComputerPartVisitor.java
public interface ComputerPartVisitor {
    public void visit(Computer computer);
    public void visit(Mouse mouse);
    public void visit(Keyboard keyboard);
    public void visit(Monitor monitor);
}
步驟 4
創(chuàng)建實現(xiàn)了上述類的實體訪問者。
ComputerPartDisplayVisitor.java
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

   @Override
   public void visit(Computer computer) {
      System.out.println("Displaying Computer.");
   }

   @Override
   public void visit(Mouse mouse) {
      System.out.println("Displaying Mouse.");
   }

   @Override
   public void visit(Keyboard keyboard) {
      System.out.println("Displaying Keyboard.");
   }

   @Override
   public void visit(Monitor monitor) {
      System.out.println("Displaying Monitor.");
   }
}
步驟 5
使用 ComputerPartDisplayVisitor 來顯示 Computer 的組成部分梨睁。
VisitorPatternDemo.java
public class VisitorPatternDemo {
   public static void main(String[] args) {

      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}
步驟 6
驗證輸出鲸睛。
Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.
``
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坡贺,隨后出現(xiàn)的幾起案子官辈,更是在濱河造成了極大的恐慌,老刑警劉巖拴念,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钧萍,死亡現(xiàn)場離奇詭異褐缠,居然都是意外死亡政鼠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門队魏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來公般,“玉大人,你說我怎么就攤上這事胡桨」倭保” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵昧谊,是天一觀的道長刽虹。 經(jīng)常有香客問我,道長呢诬,這世上最難降的妖魔是什么涌哲? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮尚镰,結(jié)果婚禮上阀圾,老公的妹妹穿的比我還像新娘。我一直安慰自己狗唉,他們只是感情好初烘,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著分俯,像睡著了一般肾筐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缸剪,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天局齿,我揣著相機與錄音,去河邊找鬼橄登。 笑死抓歼,一個胖子當著我的面吹牛讥此,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谣妻,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼萄喳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹋半?” 一聲冷哼從身側(cè)響起他巨,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎减江,沒想到半個月后染突,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡辈灼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年份企,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡莹。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡司志,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出降宅,到底是詐尸還是另有隱情骂远,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布腰根,位于F島的核電站激才,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏额嘿。R本人自食惡果不足惜瘸恼,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岩睁。 院中可真熱鬧钞脂,春花似錦、人聲如沸捕儒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刘莹。三九已至阎毅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間点弯,已是汗流浹背扇调。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抢肛,地道東北人狼钮。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓碳柱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熬芜。 傳聞我的和親對象是個殘疾皇子莲镣,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 【學習難度:★★☆☆☆,使用頻率:★★★☆☆】直接出處:訪問者模式梳理和學習:https://github.com...
    BruceOuyang閱讀 883評論 2 2
  • 1.初識訪問者模式 表示一個作用于某對象結(jié)構(gòu)中的各元素的操作涎拉。它使你可以在不改變各元素的類的前提下定義作用于這些元...
    王偵閱讀 527評論 0 0
  • 在訪問者模式(Visitor Pattern)中瑞侮,我們使用了一個訪問者類,它改變了元素類的執(zhí)行算法鼓拧。通過這種方式半火,...
    陳吉思_汗閱讀 95評論 0 0
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是訪問者模式 模式的結(jié)構(gòu) 典型代碼 訪問者模式中的偽動態(tài)雙分派 代碼示例 訪問者...
    w1992wishes閱讀 860評論 0 6
  • 關(guān)鍵詞:行動,熱切季俩,活動钮糖,為行動而行動,冒險种玛,旅行藐鹤,混亂瓤檐,受阻 興趣廣泛赂韵,像火一樣令人著迷,他渴望征服哲學與精神領(lǐng)...
    小飛俠303閱讀 359評論 0 1