訪問者模式

1 介紹


Acey:小白,放假了你天天在家干嘛呀讳癌?

小白:天天在家玩呢穿稳,整個(gè)人都頹風(fēng)了。

Acey:這么嚴(yán)重晌坤,那咋們今天去圖書館轉(zhuǎn)轉(zhuǎn)吧逢艘。

小白:好哇好哇。

Acey:不過咋們先..

小白:Stop骤菠,I konw它改, I konw 你又要講設(shè)計(jì)模式了吧,,???,,。

Acey:哈哈商乎,還是你懂我央拖。

訪問者模式:Visitor 模式是行為模式的一種。將訪問者和訪問者所訪問的元素進(jìn)行分離鹉戚,在不改變已有類的情況下增加新的操作鲜戒。

小白:如果拿圖書館舉例的話,其中訪問者就可以是管理員或者是讀者抹凳,而被訪問的元素就是不同分館內(nèi)的書籍對(duì)嗎遏餐?

Acey:可以這么說,不同的管理員可以管理不同的分館赢底,即使在分館不變的情況下失都,我們也可以增加管理員讓其管理多個(gè)分館。

2 實(shí)現(xiàn)


先來看看訪問者模式的類圖

類圖

其中:

  • Visitor:訪問者角色幸冻,為每一個(gè)具體訪問者角色創(chuàng)建一個(gè)訪問操作接口
  • ConcreteVisitor:具體訪問者角色粹庞,實(shí)現(xiàn) Vistor 接口,并實(shí)現(xiàn)獨(dú)自的操作嘁扼。
  • Element:元素角色信粮,定義一個(gè)接收訪問者方法,以訪問者作為參數(shù)趁啸。
  • ConcreteElement:具體元素角色强缘,實(shí)現(xiàn)Element接口并實(shí)現(xiàn)接收操作督惰。
  • ObjectStructure:對(duì)象結(jié)構(gòu)角色,使訪問者能夠訪問到對(duì)應(yīng)的元素旅掂。

具體實(shí)現(xiàn)

一步:創(chuàng)建Vistor角色

Visitor.class

//訪問者接口
public interface Visitor {
    //訪問文化館的接口
    public void visitor(Literature literature);
    //訪問自然館的接口
    public void visitor(Natural natural);
}

二步赏胚,創(chuàng)建具體的Vistor角色

LiteratureAdmin.class / NaturalAdmin.class

//文化類書籍管理員
public class LiteratureAdmin implements Visitor{

    @Override
    public void visitor(Literature literature) {
        System.out.println("Literature 管理員負(fù)責(zé)管理文化類書籍");
        
    }

    @Override
    public void visitor(Natural natural) {
    }

}
//自然類書籍管理員
public class NaturalAdmin implements Visitor{

    @Override
    public void visitor(Literature literature) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void visitor(Natural natural) {
        System.out.println("Natural 管理員負(fù)責(zé)管理自然類書籍");
        
    }

}

三步,創(chuàng)建Element角色

Library.class

//圖書館接口
public interface Library {
    public void accept(Visitor visitor);
}

四步商虐,創(chuàng)建具體的Element角色

Literature.class / Natural.class

//文化館
public class Literature implements Library{

    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);
    }

}
//自然館
public class Natural implements Library{

    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);
    }

}

五步觉阅,創(chuàng)建ObjectStructure

LibraryCon.class


//對(duì)象構(gòu)造角色 -- 訪問者進(jìn)行訪問
public class LibraryCon implements Library {
    private Literature literature;
    private Natural natural;
    
    public LibraryCon(){
        literature = new Literature();
        natural = new Natural();
    }
    
    @Override
    public void accept(Visitor visitor) {
        literature.accept(visitor);
        natural.accept(visitor);
    }

}

五步,測試

MainClass.class

public class MainClass {
    public static void main(String[] args) {
        //創(chuàng)建對(duì)象結(jié)構(gòu)角色
        LibraryCon con = new LibraryCon();
        //具體的訪問者
        LiteratureAdmin literatureAdmin = new LiteratureAdmin();
        NaturalAdmin naturalAdmin = new NaturalAdmin();
        //進(jìn)行訪問
        con.accept(naturalAdmin);
        con.accept(literatureAdmin);
    }
}
result

這樣就實(shí)現(xiàn)了一個(gè)簡單的訪問者模式秘车,不同的訪問者可以去訪問不同的元素典勇。在元素不改變的情況下,我們?cè)黾右粋€(gè)新的訪問者很容易叮趴,不需要去改變?cè)乇旧砀铙稀5侨绻覀円バ略鲆粋€(gè)元素那么就會(huì)非常困難,不僅需要去改動(dòng)元素本身眯亦,還需要去修改訪問者伤溉。

喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復(fù)??
上一篇:《命令模式 - 年年年貨》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妻率,一起剝皮案震驚了整個(gè)濱河市乱顾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宫静,老刑警劉巖走净,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異囊嘉,居然都是意外死亡温技,警方通過查閱死者的電腦和手機(jī)革为,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門扭粱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人震檩,你說我怎么就攤上這事琢蛤。” “怎么了抛虏?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵博其,是天一觀的道長。 經(jīng)常有香客問我迂猴,道長慕淡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任沸毁,我火速辦了婚禮峰髓,結(jié)果婚禮上傻寂,老公的妹妹穿的比我還像新娘。我一直安慰自己携兵,他們只是感情好疾掰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徐紧,像睡著了一般静檬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上并级,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天拂檩,我揣著相機(jī)與錄音,去河邊找鬼嘲碧。 笑死广恢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呀潭。 我是一名探鬼主播钉迷,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼钠署!你這毒婦竟也來了糠聪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤谐鼎,失蹤者是張志新(化名)和其女友劉穎舰蟆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狸棍,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡身害,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了草戈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌鸯。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唐片,靈堂內(nèi)的尸體忽然破棺而出丙猬,到底是詐尸還是另有隱情,我是刑警寧澤费韭,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布茧球,位于F島的核電站,受9級(jí)特大地震影響星持,放射性物質(zhì)發(fā)生泄漏抢埋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揪垄。 院中可真熱鬧鲤屡,春花似錦、人聲如沸福侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肪凛。三九已至堰汉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伟墙,已是汗流浹背翘鸭。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戳葵,地道東北人就乓。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像拱烁,于是被迫代替她去往敵國和親生蚁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

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