Java的訪問者模式

>《設(shè)計模式》一書對于訪問者模式給出的定義為:表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作怒炸。從定義可以看出結(jié)構(gòu)對象是使用訪問者模式必須條件累驮,而且這個結(jié)構(gòu)對象必須存在遍歷自身各個對象的方法擎析。這便類似于java中的collection概念了幸海。

以下是訪問者模式的組成結(jié)構(gòu):

* 1) 訪問者角色(Visitor):為該對象結(jié)構(gòu)中具體元素角色聲明一個訪問操作接口蜜自。該操作接口的名字和參數(shù)標(biāo)識了發(fā)送訪問請求給具體訪問者的具體元素角色诫肠。這樣訪問者就可以通過該元素角色的特定接口直接訪問它司澎。

* 2) 具體訪問者角色(Concrete Visitor):實現(xiàn)每個由訪問者角色(Visitor)聲明的操作欺缘。

* 3) 元素角色(Element):定義一個Accept操作,它以一個訪問者為參數(shù)挤安。

* 4) 具體元素角色(Concrete Element):實現(xiàn)由元素角色提供的Accept操作谚殊。

* 5) 對象結(jié)構(gòu)角色(Object Structure):這是使用訪問者模式必備的角色。它要具備以下特征:能枚舉它的元素蛤铜;可以提供一個高層的接口以允許該訪問者訪問它的元素嫩絮;可以是一個復(fù)合(組合模式)或是一個集合,如一個列表或一個無序集合昂羡。

UML

訪問者模式.png

例子

假設(shè)果園里面 有兩個種類的水果樹絮记,蘋果樹和橘子樹!
農(nóng)民和機(jī)器分別要對樹澆水虐先。

抽象一下
訪問者角色:需要澆水
具體訪問者角色; 農(nóng)民 怨愤、機(jī)器
具體元素角色:橘子樹、蘋果樹
對象結(jié)構(gòu)元素蛹批,果園

代碼
<pre>
/**

  • Created by zxy on 2017/3/30.
    */
    public abstract class Tree {
    public abstract void accept(Visitor visitor);
    public abstract void water();//澆水操作
    }
    </pre>

蘋果樹
<pre>
package com.zxy.review.designpattern.structuremodel.visitors;

/**

  • Created by zxy on 2017/3/30.
    */
    public class AppleTree extends Tree {
    @Override
    public void accept(Visitor visitor) {
    visitor.visit(this);
    }

    @Override
    public void water() {
    System.err.println("I am apple tree,visitor water !");
    }
    }

</pre>

<pre>
package com.zxy.review.designpattern.structuremodel.visitors;

/**

  • Created by zxy on 2017/3/30.
    */
    public class OrangeTree extends Tree {
    @Override
    public void accept(Visitor visitor) {
    visitor.visit(this);
    }

    @Override
    public void water() {
    System.err.println("I am Orange tree ,visitor water !");
    }
    }

</pre>

<pre>
package com.zxy.review.designpattern.structuremodel.visitors;

/**

  • Created by zxy on 2017/3/30.

  • 機(jī)器澆水
    */
    public class MachineVisitor implements Visitor{

    @Override
    public void visit(AppleTree appleTree) {
    System.out.println("MachineVisitor");
    appleTree.water();//接收澆水
    }

    @Override
    public void visit(OrangeTree orangeTree) {
    System.out.println("MachineVisitor");
    orangeTree.water();//接收澆水
    }

}

</pre>

<pre>
package com.zxy.review.designpattern.structuremodel.visitors;

/**

  • Created by zxy on 2017/3/30.
  • 農(nóng)夫澆水

*/
public class FarmerVisitor implements Visitor {
@Override
public void visit(AppleTree appleTree) {
System.out.println("FarmerVisitor");
appleTree.water();//接收澆水
}

@Override
public void visit(OrangeTree orangeTree) {
    System.out.println("FarmerVisitor");
    orangeTree.water();//接收澆水
}

}

</pre>

果園和調(diào)用類
<pre>
package com.zxy.review.designpattern.structuremodel.visitors;

import java.util.ArrayList;

public class Main {

public static  class ManyTrees {
    public  static  ArrayList<Tree> getAllTrees() {
        ArrayList<Tree> tree = new ArrayList<>();
        for(int i=0;i<3;i++ ){
            if(i>1){
                tree.add(new AppleTree());
            } else {
                tree.add(new OrangeTree());
            }
        }

        return tree;
    }
}

public static void main(String[] args) {
    System.out.println("Hello World!");
    ArrayList<Tree> trees = ManyTrees.getAllTrees();
    FarmerVisitor farmerVisitor = new FarmerVisitor();
    MachineVisitor machineVisitor = new MachineVisitor();

    for(int i=0;i< trees.size();i++ ){
        trees.get(i).accept(farmerVisitor);
        trees.get(i).accept(machineVisitor);
    }
}

}

</pre>

結(jié)果

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撰洗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腐芍,更是在濱河造成了極大的恐慌差导,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猪勇,死亡現(xiàn)場離奇詭異设褐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泣刹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門助析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椅您,你說我怎么就攤上這事外冀。” “怎么了掀泳?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵雪隧,是天一觀的道長。 經(jīng)常有香客問我员舵,道長脑沿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任马僻,我火速辦了婚禮捅伤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巫玻。我一直安慰自己丛忆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布仍秤。 她就那樣靜靜地躺著熄诡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诗力。 梳的紋絲不亂的頭發(fā)上凰浮,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音苇本,去河邊找鬼袜茧。 笑死,一個胖子當(dāng)著我的面吹牛瓣窄,可吹牛的內(nèi)容都是我干的笛厦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼俺夕,長吁一口氣:“原來是場噩夢啊……” “哼裳凸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起劝贸,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姨谷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后映九,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梦湘,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年件甥,在試婚紗的時候發(fā)現(xiàn)自己被綠了捌议。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚼蚀,死狀恐怖禁灼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轿曙,我是刑警寧澤弄捕,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站导帝,受9級特大地震影響守谓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜您单,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一斋荞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虐秦,春花似錦平酿、人聲如沸凤优。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筑辨。三九已至,卻和暖如春幸逆,著一層夾襖步出監(jiān)牢的瞬間棍辕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工还绘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留楚昭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓拍顷,卻偏偏與公主長得像抚太,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菇怀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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

  • 1 場景問題# 1.1 擴(kuò)展客戶管理的功能## 考慮這樣一個應(yīng)用:擴(kuò)展客戶管理的功能凭舶。 既然是擴(kuò)展功能,那么肯定是...
    七寸知架構(gòu)閱讀 2,917評論 1 58
  • 設(shè)計模式匯總 一爱沟、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用帅霜、多...
    MinoyJet閱讀 3,948評論 1 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法呼伸,內(nèi)部類的語法身冀,繼承相關(guān)的語法,異常的語法括享,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 訪問者模式Visitor 背景 1.概述 在軟件開發(fā)過程中搂根,對于系統(tǒng)中的某些對象,它們存儲在同一個集合collec...
    踐行者閱讀 463評論 0 2
  • 2016也馬上過去了仁卷,你是否也有這樣的感受時光匆匆。 最近在寫16年總結(jié)以及17年的目標(biāo)和計劃犬第。 16年三大事件讓...
    陳美艷閱讀 248評論 0 1