訪問(wèn)者模式

1 介紹


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

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

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

小白:好哇好哇。

Acey:不過(guò)咋們先..

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

Acey:哈哈,還是你懂我。

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

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

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

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


先來(lái)看看訪問(wèn)者模式的類(lèi)圖

類(lèi)圖

其中:

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

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

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

Visitor.class

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

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

LiteratureAdmin.class / NaturalAdmin.class

//文化類(lèi)書(shū)籍管理員
public class LiteratureAdmin implements Visitor{

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

    @Override
    public void visitor(Natural natural) {
    }

}
//自然類(lèi)書(shū)籍管理員
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é)管理自然類(lèi)書(shū)籍");
        
    }

}

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

Library.class

//圖書(shū)館接口
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)造角色 -- 訪問(wèn)者進(jìn)行訪問(wè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);
    }

}

五步,測(cè)試

MainClass.class

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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