色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

設(shè)計(jì)模式:訪問者設(shè)計(jì)模式

冬至子 ? 來源:墨風(fēng)如雪小站 ? 作者:墨風(fēng)如雪 ? 2023-06-06 11:25 ? 次閱讀

一、概述

1.1 定義

訪問者設(shè)計(jì)模式是一種行為型設(shè)計(jì)模式,用于將算法與對象結(jié)構(gòu)分離。它允許你在不改變對象結(jié)構(gòu)的前提下定義新的操作。

1.2 作用

訪問者模式的作用是在不改變對象結(jié)構(gòu)的前提下定義新的操作。它允許你定義一個(gè)新的操作,而無需修改現(xiàn)有的對象結(jié)構(gòu)。在訪問者模式中,我們將操作封裝在訪問者對象中,并在元素對象上調(diào)用訪問者對象的方法,從而實(shí)現(xiàn)對元素對象的操作。

1.3 適用場景

訪問者模式適用于以下場景:

?對象結(jié)構(gòu)穩(wěn)定,但是經(jīng)常需要在此結(jié)構(gòu)上定義新的操作;?需要對復(fù)雜對象結(jié)構(gòu)中的對象進(jìn)行操作,而且這些對象可能具有不同的類型;?需要在不改變對象結(jié)構(gòu)的前提下,為對象結(jié)構(gòu)中的元素對象動(dòng)態(tài)添加新的操作。

二、角色

2.1 抽象訪問者(Visitor)

抽象訪問者(Visitor)定義了訪問者可以訪問的元素對象的接口。它包含了多個(gè) visit() 方法,每個(gè)方法對應(yīng)一個(gè)具體元素對象。

publicinterfaceVisitor{
void visit(ConcreteElementA elementA);
void visit(ConcreteElementB elementB);
}

在上述代碼中,我們定義了一個(gè)抽象訪問者接口 Visitor,它包含了兩個(gè) visit() 方法,分別對應(yīng)具體元素對象 ConcreteElementA 和 ConcreteElementB。

2.2 具體訪問者(ConcreteVisitor)

具體訪問者(ConcreteVisitor)實(shí)現(xiàn)了抽象訪問者接口,對不同類型的元素對象進(jìn)行具體的操作。

publicclassConcreteVisitorAimplementsVisitor{
@Override
publicvoid visit(ConcreteElementA elementA){
System.out.println("ConcreteVisitorA visit ConcreteElementA");
}


@Override
publicvoid visit(ConcreteElementB elementB){
System.out.println("ConcreteVisitorA visit ConcreteElementB");
}
}


publicclassConcreteVisitorBimplementsVisitor{
@Override
publicvoid visit(ConcreteElementA elementA){
System.out.println("ConcreteVisitorB visit ConcreteElementA");
}


@Overridepublicvoid visit(ConcreteElementB elementB){
System.out.println("ConcreteVisitorB visit ConcreteElementB");
}
}

在上述代碼中,我們定義了兩個(gè)具體訪問者類 ConcreteVisitorA 和 ConcreteVisitorB,它們分別實(shí)現(xiàn)了抽象訪問者接口 Visitor,并對不同類型的元素對象進(jìn)行具體的操作。

2.3 抽象元素(Element)

抽象元素(Element)定義了元素對象的接口,讓訪問者對象可以訪問自己的元素對象。

publicinterfaceElement{
void accept(Visitor visitor);
}

在上述代碼中,我們定義了一個(gè)抽象元素接口 Element,它包含了一個(gè) accept() 方法,該方法接收一個(gè)訪問者對象作為參數(shù)

2.4 具體元素(ConcreteElement)

具體元素(ConcreteElement)實(shí)現(xiàn)了抽象元素接口,定義了自己的 accept() 方法,該方法調(diào)用訪問者對象的 visit() 方法,并將自身作為參數(shù)傳入。

publicclassConcreteElementAimplementsElement{
@Override
publicvoid accept(Visitor visitor){
        visitor.visit(this);
}
}


publicclassConcreteElementBimplementsElement{
@Override
publicvoid accept(Visitor visitor){
        visitor.visit(this);
}
}

在上述代碼中,我們定義了兩個(gè)具體元素類 ConcreteElementA 和 ConcreteElementB,它們分別實(shí)現(xiàn)了抽象元素接口 Element,并在 accept() 方法中調(diào)用訪問者對象的 visit() 方法,并將自身作為參數(shù)傳入。

2.5 對象結(jié)構(gòu)(Object Structure)

對象結(jié)構(gòu)(Object Structure)是元素對象的集合,它提供了一個(gè)接口,讓訪問者對象可以訪問集合中的元素對象。

publicclassObjectStructure{
privateList< Element > elements =newArrayList<  >();


publicvoid attach(Element element){
        elements.add(element);
}


publicvoid detach(Element element){
        elements.remove(element);
}


publicvoid accept(Visitor visitor){
for(Element element : elements){
            element.accept(visitor);
}
}
}

在上述代碼中,我們定義了一個(gè)對象結(jié)構(gòu)類 ObjectStructure,它包含了一個(gè)元素對象的集合 elements,提供了 attach() 和 detach() 方法,用于添加和刪除元素對象。它還提供了一個(gè) accept() 方法,該方法遍歷元素對象集合,并調(diào)用每個(gè)元素對象的accept() 方法,將訪問者對象作為參數(shù)傳入。

三、實(shí)現(xiàn)步驟

3.1 創(chuàng)建抽象元素類

publicinterfaceElement{
void accept(Visitor visitor);
}

3.2 創(chuàng)建具體元素類

publicclassConcreteElementAimplementsElement{
@Override
publicvoid accept(Visitor visitor){
        visitor.visit(this);
}
}


publicclassConcreteElementBimplementsElement{
@Override
publicvoid accept(Visitor visitor){
        visitor.visit(this);
}
}

3.3 創(chuàng)建抽象訪問者類

publicinterfaceVisitor{
void visit(ConcreteElementA elementA);
void visit(ConcreteElementB elementB);
}

3.4 創(chuàng)建具體訪問者類

publicclassConcreteVisitorAimplementsVisitor{
@Override
publicvoid visit(ConcreteElementA elementA){
System.out.println("ConcreteVisitorA visit ConcreteElementA");
}


@Override
publicvoid visit(ConcreteElementB elementB){
System.out.println("ConcreteVisitorA visit ConcreteElementB");
}
}


publicclassConcreteVisitorBimplementsVisitor{
@Override
publicvoid visit(ConcreteElementA elementA){
System.out.println("ConcreteVisitorB visit ConcreteElementA");
}


@Override
    publicvoid visit(ConcreteElementB elementB){
System.out.println("ConcreteVisitorB visit ConcreteElementB");
}
}

3.5 創(chuàng)建對象結(jié)構(gòu)類

publicclassObjectStructure{
privateList< Element > elements =newArrayList<  >();


publicvoid attach(Element element){
        elements.add(element);
}


publicvoid detach(Element element){
        elements.remove(element);
}


publicvoid accept(Visitor visitor){
for(Element element : elements){
            element.accept(visitor);
}
}
}

3.6 客戶端調(diào)用

publicclassClient{
publicstaticvoid main(String[] args){
ObjectStructure objectStructure =newObjectStructure();
        objectStructure.attach(newConcreteElementA());
        objectStructure.attach(newConcreteElementB());


Visitor visitorA =newConcreteVisitorA();
Visitor visitorB =newConcreteVisitorB();


        objectStructure.accept(visitorA);
        objectStructure.accept(visitorB);
}
}

在上述代碼中,我們創(chuàng)建了一個(gè)對象結(jié)構(gòu) objectStructure,并向其中添加了兩個(gè)元素對象 ConcreteElementA 和 ConcreteElementB。然后,我們創(chuàng)建了兩個(gè)具體訪問者對象 visitorA 和 visitorB,并調(diào)用 objectStructure 的 accept() 方法,將這兩個(gè)訪問者對象作為參數(shù)傳入。在 accept() 方法中,我們遍歷元素對象集合 elements,并依次調(diào)用每個(gè)元素對象的 accept() 方法,將訪問者對象作為參數(shù)傳入。

四、優(yōu)缺點(diǎn)

4.1 優(yōu)點(diǎn)

訪問者設(shè)計(jì)模式的優(yōu)點(diǎn)包括:

?可以在不改變對象結(jié)構(gòu)的前提下定義新的操作;?可以將代碼的穩(wěn)定性和易于擴(kuò)展性相結(jié)合;?可以使得增加新的操作變得簡單。

4.2 缺點(diǎn)

訪問者設(shè)計(jì)模式的缺點(diǎn)包括:

?增加新的元素對象比較困難;?元素對象的訪問者接口必須穩(wěn)定,否則會(huì)導(dǎo)致所有訪問者對象都需要進(jìn)行修改;?具體元素對象對訪問者對象的訪問是單向的,訪問者對象無法訪問元素對象的其他方法。

五、擴(kuò)展點(diǎn)

5.1 雙重分派

在訪問者設(shè)計(jì)模式中,我們可以通過雙重分派來實(shí)現(xiàn)不同的操作。雙重分派是指在訪問者對象中定義了多個(gè)具體的 visit() 方法,每個(gè)方法對應(yīng)一個(gè)具體元素對象,然后在元素對象中調(diào)用訪問者對象的 visit() 方法,并將自身作為參數(shù)傳入。

雙重分派的實(shí)現(xiàn)方式是通過重載 accept() 方法來實(shí)現(xiàn)的。具體來說,我們在抽象元素接口 Element 中定義多個(gè) accept() 方法,每個(gè)方法對應(yīng)一個(gè)具體訪問者對象,并在具體元素對象中重載這些 accept() 方法,將具體訪問者對象作為參數(shù)傳入。

下面是一個(gè)雙重分派的示例代碼:

publicinterfaceElement{
void accept(Visitor visitor);
void accept(Visitor visitor,String param);
}


publicclassConcreteElementAimplementsElement{
@Override
publicvoid accept(Visitor visitor){
        visitor.visit(this);
}


@Override
publicvoid accept(Visitor visitor,String param){
        visitor.visit(this, param);
}
}


publicinterfaceVisitor{
void visit(ConcreteElementA elementA);
void visit(ConcreteElementB elementB);
void visit(ConcreteElementA elementA,String param);
}


publicclassConcreteVisitorAimplementsVisitor{
@Override
publicvoid visit(ConcreteElementA elementA){
System.out.println("ConcreteVisitorA visit ConcreteElementA");
}


@Override
publicvoid visit(ConcreteElementB elementB){
System.out.println("ConcreteVisitorA visit ConcreteElementB");
}


@Override
publicvoid visit(ConcreteElementA elementA,String param){
System.out.println("ConcreteVisitorA visit ConcreteElementA with param "+ param);
}
}


publicclassConcreteVisitorBimplementsVisitor{
@Override
publicvoid visit(ConcreteElementA elementA){
System.out.println("ConcreteVisitorB visit ConcreteElementA");
}


@Override
publicvoid visit(ConcreteElementB elementB){
System.out.println("ConcreteVisitorB visit ConcreteElementB");
}


@Override
publicvoid visit(ConcreteElementA elementA,String param){
System.out.println("ConcreteVisitorB visit ConcreteElementA with param "+ param);
}
}


publicclassObjectStructure{
privateList< Element > elements =newArrayList<  >();


publicvoid attach(Element element){
        elements.add(element);
}


publicvoid detach(Element element){
        elements.remove(element);
}


publicvoid accept(Visitor visitor){
for(Element element : elements){
            element.accept(visitor);
}
}


publicvoid accept(Visitor visitor,String param){
for(Element element : elements){
            element.accept(visitor, param);
}
}
}


publicclassClient{
publicstaticvoid main(String[] args){
ObjectStructure objectStructure =newObjectStructure();
        objectStructure.attach(newConcreteElementA());
        objectStructure.attach(newConcreteElementB());


Visitor visitorA =newConcreteVisitorA();
Visitor visitorB =newConcreteVisitorB();


        objectStructure.accept(visitorA);
        objectStructure.accept(visitorB);
        objectStructure.accept(visitorA,"paramA");
        objectStructure.accept(visitorB,"paramB");
}
}

在上述代碼中,我們定義了一個(gè)新的 accept() 方法,該方法接收一個(gè)額外的參數(shù) param,并在具體元素對象的 accept() 方法中將該參數(shù)傳遞給訪問者對象的 visit() 方法。然后,我們創(chuàng)建了兩個(gè)具體訪問者對象 visitorA 和 visitorB,并分別調(diào)用 objectStructure 的 accept() 方法,將這兩個(gè)訪問者對象作為參數(shù)傳入,并在第二個(gè) accept() 方法中傳遞了參數(shù) "paramA" 和 "paramB"。在訪問者對象的 visit() 方法中,我們可以根據(jù)傳遞的參數(shù)進(jìn)行不同的操作。

雙重分派的優(yōu)點(diǎn)是可以根據(jù)傳遞的參數(shù)實(shí)現(xiàn)不同的操作,從而增強(qiáng)了訪問者模式的靈活性和擴(kuò)展性。

然而,雙重分派也有一些缺點(diǎn)。首先,它會(huì)導(dǎo)致類的層次結(jié)構(gòu)變得復(fù)雜,因?yàn)槊總€(gè)具體元素對象都需要實(shí)現(xiàn)多個(gè) accept() 方法。其次,雙重分派會(huì)增加代碼的復(fù)雜性,因?yàn)樾枰谠L問者對象中定義多個(gè)具體的 visit() 方法,并在具體元素對象中重載多個(gè) accept() 方法。最后,雙重分派可能會(huì)導(dǎo)致代碼的可讀性變差,因?yàn)樾枰斫舛鄠€(gè)層次的調(diào)用關(guān)系。

因此,在使用雙重分派時(shí)需要謹(jǐn)慎考慮,避免過度使用,以免導(dǎo)致代碼的復(fù)雜性和可維護(hù)性下降。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Elements
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    5339
收藏 人收藏

    評論

    相關(guān)推薦

    如何判斷訪問者的瀏覽器是否打開了JAVASCRIPT功能?

    如何判斷訪問者的瀏覽器是否打開了JAVASCRIPT功能?作者:Hunte | 收錄日期 : 2000-08-21   用這段代碼就可以了
    發(fā)表于 01-11 09:33

    狀態(tài)機(jī)模式與生產(chǎn)/消費(fèi)模式的關(guān)系

    原來有些明白,但是現(xiàn)在又有點(diǎn)糊涂了 ,狀態(tài)機(jī)模式和生產(chǎn)/消費(fèi)模式之間到底有沒有關(guān)系?有的話到底是什么樣子的關(guān)系?求大神解釋?。。。?!
    發(fā)表于 03-04 11:37

    基于觀察模式的屏幕布局控件設(shè)計(jì)

    觀察模式作為設(shè)計(jì)模式中行為模式的一種,解決了上述具有一對多依賴關(guān)系對象重用問題。文中在分析觀察模式
    發(fā)表于 02-13 16:20 ?4次下載
    基于觀察<b class='flag-5'>者</b><b class='flag-5'>模式</b>的屏幕布局控件設(shè)計(jì)

    Java設(shè)計(jì)模式(二十一):中介模式

    中介模式(Mediator Pattern) 中介模式(Mediator Pattern): 屬于對象的行為模式。又叫調(diào)停
    發(fā)表于 01-24 11:28 ?329次閱讀

    配置Nginx訪問日志

    每當(dāng)處理客戶請求時(shí),Nginx都會(huì)在訪問日志中生成一個(gè)新記錄。每個(gè)事件記錄都包含一個(gè)時(shí)間戳,并包含有關(guān)客戶端和所請求資源的各種信息。訪問日志可以顯示訪問者的位置,訪問者
    的頭像 發(fā)表于 05-24 09:59 ?2407次閱讀

    嵌入式軟件設(shè)計(jì)模式 好文值得收藏

    本文引用自本人公眾號文章: 嵌入式開發(fā)中的兩點(diǎn)編程思想 ? C語言也很講究設(shè)計(jì)模式?一文講透 ? 包含如下: 01)C語言和設(shè)計(jì)模式(繼承、封裝、多態(tài)) ? 02)C語言和設(shè)計(jì)模式訪問者
    的頭像 發(fā)表于 06-20 09:09 ?2075次閱讀

    GoF設(shè)計(jì)模式訪問者模式

    訪問者模式的目的是,解耦數(shù)據(jù)結(jié)構(gòu)和算法,使得系統(tǒng)能夠在不改變現(xiàn)有代碼結(jié)構(gòu)的基礎(chǔ)上,為對象新增一種新的操作。
    的頭像 發(fā)表于 10-08 11:05 ?784次閱讀

    用C語言編寫建造模式

    建造模式: 也稱生成器模式,是 23 種設(shè)計(jì)模式中的一種,是一種創(chuàng)建型模式。適用情況:一個(gè)對象比較復(fù)雜,將一個(gè)對象的構(gòu)建和對象的表示進(jìn)行分
    發(fā)表于 06-05 11:31 ?618次閱讀
    用C語言編寫建造<b class='flag-5'>者</b><b class='flag-5'>模式</b>

    設(shè)計(jì)模式行為型:中介模式

    提供一個(gè)中介完成對一系列操作的封裝,降低對象間的系統(tǒng)耦合度。中介模式又稱為調(diào)停模式
    的頭像 發(fā)表于 06-06 17:42 ?773次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>行為型:中介<b class='flag-5'>模式</b>

    設(shè)計(jì)模式行為型:訪問者模式

    訪問者模式(Visitor Pattern)中,我們使用了一個(gè)訪問者類,它改變了元素類的執(zhí)行算法。
    的頭像 發(fā)表于 06-07 15:11 ?821次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>行為型:<b class='flag-5'>訪問者</b><b class='flag-5'>模式</b>

    設(shè)計(jì)模式行為型:觀察模式

    定義對象之間的一種一對多依賴關(guān)系,使得每一個(gè)對象發(fā)生狀態(tài)的變化時(shí),其相關(guān)依賴對象皆得到通知并被自動(dòng)更新,又稱為發(fā)布-訂閱模式、模型-視圖模式、源-監(jiān)聽器模式或從屬
    的頭像 發(fā)表于 06-07 16:56 ?748次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>行為型:觀察<b class='flag-5'>者</b><b class='flag-5'>模式</b>

    設(shè)計(jì)模式創(chuàng)造性:建造模式

    建造模式(Builder Pattern)使用多個(gè)簡單的對象一步一步構(gòu)建成一個(gè)復(fù)雜的對象。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
    的頭像 發(fā)表于 06-09 16:25 ?816次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>創(chuàng)造性:建造<b class='flag-5'>者</b><b class='flag-5'>模式</b>

    UVM設(shè)計(jì)模式訪問者模式

    Visitor Pattern: 允許一個(gè)或者多個(gè)操作應(yīng)用到一組對象上,解耦操作和對象本身。換言之,如果component的數(shù)據(jù)結(jié)構(gòu)是比較穩(wěn)定的,但其是易于變化的,那么使用訪問者模式是個(gè)不錯(cuò)的選擇。
    的頭像 發(fā)表于 08-11 09:28 ?860次閱讀
    UVM設(shè)計(jì)<b class='flag-5'>模式</b>之<b class='flag-5'>訪問者</b><b class='flag-5'>模式</b>

    設(shè)計(jì)模式中代理模式的使用場景

    官方定義: 代理模式 (Proxy Pattern) 是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過代理對象控制對原對象的訪問,并允許在訪問前或訪問后做一些處理
    的頭像 發(fā)表于 10-08 14:34 ?1165次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>中代理<b class='flag-5'>模式</b>的使用場景

    什么是觀察設(shè)計(jì)模式?Golang中的觀察模式介紹

    當(dāng)涉及到訂單處理系統(tǒng)時(shí),觀察設(shè)計(jì)模式可以用于實(shí)現(xiàn)訂單狀態(tài)的變化和通知。
    的頭像 發(fā)表于 01-08 10:08 ?507次閱讀
    主站蜘蛛池模板: 2017日日干| 亚洲精品无码不卡在线播放he | 午夜天堂一区人妻 | 国产成人拍精品视频网 | 超碰在线公开视频 | 暖暖的高清视频在线观看免费中文 | 国产成人精品在视频 | 国产一区在线观看免费 | 美女网站免费久久久久久久 | 国产一区内射最近更新 | 噜噜噜狠狠夜夜躁精品 | 亚洲 中文 自拍 无码 | 女人麻豆国产香蕉久久精品 | 国产人妻精品久久久久久很牛 | 两个人看的www免费高清直播 | 一本道高清到手机在线 | 亚洲天码中字 | 两个人在线观看的视频720 | 强奸美女老师 | 影音先锋男人av橹橹色 | 中文字幕福利视频在线一区 | 99久久伊人一区二区yy5099 | 婷婷综合久久狠狠色 | 午夜福利理论片在线播放 | 青青草A在在观免费线观看 青青草AV国产精品 青青草 久久久 | 黄色三级视频网站 | 一本大道熟女人妻中文字幕在线 | 石原莉奈rbd806中文字幕 | 67194线在线精品观看 | 两个人的视频免费 | 99久免费精品视频在线观看2 | 亚洲AV久久无码精品国产网站 | 99精品国产第一福利网站 | 久久精品热在线观看30 | 牛牛超碰 国产 | 午夜啪啪免费视频 | 99久酒店在线精品2019 | 国产亚洲精品久久久久久国 | 色多多污污版免费下载安装 | 国产精品久久久久久52AVAV | 黄页网站18以下勿看免费 |