欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

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

一、概述

1.1 定義

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

1.2 作用

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

1.3 適用場景

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

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

二、角色

2.1 抽象訪問者(Visitor)

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

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

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

2.2 具體訪問者(ConcreteVisitor)

具體訪問者(ConcreteVisitor)實現(xià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");
}
}

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

2.3 抽象元素(Element)

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

publicinterfaceElement{
void accept(Visitor visitor);
}

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

2.4 具體元素(ConcreteElement)

具體元素(ConcreteElement)實現(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);
}
}

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

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

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

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);
}
}
}

在上述代碼中,我們定義了一個對象結(jié)構(gòu)類 ObjectStructure,它包含了一個元素對象的集合 elements,提供了 attach() 和 detach() 方法,用于添加和刪除元素對象。它還提供了一個 accept() 方法,該方法遍歷元素對象集合,并調(diào)用每個元素對象的accept() 方法,將訪問者對象作為參數(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)建了一個對象結(jié)構(gòu) objectStructure,并向其中添加了兩個元素對象 ConcreteElementA 和 ConcreteElementB。然后,我們創(chuàng)建了兩個具體訪問者對象 visitorA 和 visitorB,并調(diào)用 objectStructure 的 accept() 方法,將這兩個訪問者對象作為參數(shù)傳入。在 accept() 方法中,我們遍歷元素對象集合 elements,并依次調(diào)用每個元素對象的 accept() 方法,將訪問者對象作為參數(shù)傳入。

四、優(yōu)缺點

4.1 優(yōu)點

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

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

4.2 缺點

訪問者設(shè)計模式的缺點包括:

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

五、擴展點

5.1 雙重分派

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

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

下面是一個雙重分派的示例代碼:

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");
}
}

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

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

然而,雙重分派也有一些缺點。首先,它會導(dǎo)致類的層次結(jié)構(gòu)變得復(fù)雜,因為每個具體元素對象都需要實現(xiàn)多個 accept() 方法。其次,雙重分派會增加代碼的復(fù)雜性,因為需要在訪問者對象中定義多個具體的 visit() 方法,并在具體元素對象中重載多個 accept() 方法。最后,雙重分派可能會導(dǎo)致代碼的可讀性變差,因為需要理解多個層次的調(diào)用關(guān)系。

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

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

    關(guān)注

    0

    文章

    6

    瀏覽量

    5331
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

    配置Nginx訪問日志

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

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

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

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

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

    用C語言編寫建造模式

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    當涉及到訂單處理系統(tǒng)時,觀察設(shè)計模式可以用于實現(xiàn)訂單狀態(tài)的變化和通知。
    的頭像 發(fā)表于 01-08 10:08 ?465次閱讀