最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java設(shè)計模式之訪問者模式

 更新時間:2021年11月05日 15:17:32   作者:一指流砂~  
這篇文章主要介紹了JAVA設(shè)計模式之訪問者模式的的相關(guān)資料,文中示例代碼非常詳細,供大家參考和學(xué)習(xí),感興趣的朋友可以了解

一、什么是訪問者模式

定義:表示一個作用于其對象結(jié)構(gòu)中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這些元素的新操作。

可以對定義這么理解:有這么一個操作,它是作用于一些元素之上的,而這些元素屬于某一個對象結(jié)構(gòu)。同時這個操作是在不改變各元素類的前提下,在這個前提下定義新操作是訪問者模式精髓中的精髓。

主要解決:穩(wěn)定的數(shù)據(jù)結(jié)構(gòu)和易變的操作耦合問題。就是把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作解耦合,使得操作集合可相對自由地演化。

本質(zhì):預(yù)留通路,回調(diào)實現(xiàn)。它的實現(xiàn)主要就是通過預(yù)先定義好調(diào)用的通路,在被訪問的對象上定義accept方法,在訪問者的對象上定義visit方法;然后在調(diào)用真正發(fā)生的時候,通過兩次分發(fā)的技術(shù),利用預(yù)先定義好的通路,回調(diào)到訪問者具體的實現(xiàn)上。

二、訪問者模式的結(jié)構(gòu)

Visitor抽象訪問者接口:它定義了對每一個元素(Element)訪問的行為,它的參數(shù)就是可以訪問的元素,它的方法個數(shù)理論上來講與元素個數(shù)(Element的實現(xiàn)類個數(shù))是一樣的,從這點不難看出,訪問者模式要求元素類的個數(shù)不能改變(不能改變的意思是說,如果元素類的個數(shù)經(jīng)常改變,則說明不適合使用訪問者模式)。

ConcreteVisitor具體訪問者角色:它需要給出對每一個元素類訪問時所產(chǎn)生的具體行為。

Element抽象節(jié)點(元素)角色:它定義了一個接受訪問者(accept)的方法,其意義是指,每一個元素都要可以被訪問者訪問。

ConcreteElement具體節(jié)點(元素)角色:它提供接受訪問方法的具體實現(xiàn),而這個具體的實現(xiàn),通常情況下是使用訪問者提供的訪問該元素類的方法。

ObjectStructure結(jié)構(gòu)對象角色:這個便是定義當(dāng)中所提到的對象結(jié)構(gòu),對象結(jié)構(gòu)是一個抽象表述,具體點可以理解為一個具有容器性質(zhì)或者復(fù)合對象特性的類,它會含有一組元素(Element),并且可以迭代這些元素,供訪問者訪問。

三、訪問者模式的使用場景

(1)對象結(jié)構(gòu)比較穩(wěn)定,但經(jīng)常需要在此對象結(jié)構(gòu)上定義新的操作。

(2)需要對一個對象結(jié)構(gòu)中的對象進行很多不同的且不相關(guān)的操作,而需要避免這些操作“污染”這些對象的類,也不希望在增加新操作時修改這些類。

四、訪問者模式的優(yōu)缺點

優(yōu)點:

1. 訪問者模式使得易于增加新的操作 訪問者使得增加依賴于復(fù)雜對象結(jié)構(gòu)的構(gòu)件的操作變得容易了。僅需增加一個新的訪問者即可在一個對象結(jié)構(gòu)上定義一個新的操作。相反, 如果每個功能都分散在多個類之上的話,定義新的操作時必須修改每一類。

2. 訪問者集中相關(guān)的操作而分離無關(guān)的操作 相關(guān)的行為不是分布在定義該對象結(jié)構(gòu)的 各個類上,而是集中在一個訪問者中。無關(guān)行為卻被分別放在它們各自的訪問者子類中。這 就既簡化了這些元素的類,也簡化了在這些訪問者中定義的算法。所有與它的算法相關(guān)的數(shù) 據(jù)結(jié)構(gòu)都可以被隱藏在訪問者中。

缺點:

1. 增加新的 ConcreteElement類很困難

Visitor模式使得難以增加新的 Element的子類。每 添加一個新的 ConcreteElement都要在 Vistor中添加一個新的抽象操作,并在每一個 ConcretVisitor類中實現(xiàn)相應(yīng)的操作。有時可以在 Visitor中提供一個缺省的實現(xiàn),這一實現(xiàn)可 以被大多數(shù)的 ConcreteVisitor繼承,但這與其說是一個規(guī)律還不如說是一種例外。

所以在應(yīng)用訪問者模式時考慮關(guān)鍵的問題是系統(tǒng)的哪個部分會經(jīng)常變化,是作用于對象結(jié)構(gòu)上的算法呢還是構(gòu)成該結(jié)構(gòu)的各個對象的類。如果老是有新的 ConcretElement類加入進來的話, Vistor類層次將變得難以維護。在這種情況下,直接在構(gòu)成該結(jié)構(gòu)的類中定義這些操作可能更容易一些。如果 Element類層次是穩(wěn)定的,而你不斷地增加操作獲修改算法,訪問者模式可以幫助你管理這些改動。

2. 破壞封裝

訪問者方法假定ConcreteElement接口的功能足夠強,足以讓訪問者進行它 們的工作。結(jié)果是,該模式常常迫使你提供訪問元素內(nèi)部狀態(tài)的公共操作,這可能會破壞它 的封裝性。

五、訪問者模式的實現(xiàn)

抽象訪問者角色:為每一個具體節(jié)點都準(zhǔn)備了一個訪問操作。

//這里由于有兩個節(jié)點,因此,對應(yīng)就有兩個訪問操作。
public interface Visitor {
    /**
     * 對應(yīng)于NodeA的訪問操作
     */
    public void visit(NodeA node);
    /**
     * 對應(yīng)于NodeB的訪問操作
     */
    public void visit(NodeB node);
}

具體訪問者

/**
 * 具體訪問者VisitorA類
 */
public class VisitorA implements Visitor {
    /**
     * 對應(yīng)于NodeA的訪問操作
     */
    @Override
    public void visit(NodeA node) {
        System.out.println(node.operationA());
    }
    /**
     * 對應(yīng)于NodeB的訪問操作
     */
    @Override
    public void visit(NodeB node) {
        System.out.println(node.operationB());
    }
}
/**
 * 具體訪問者VisitorB類
 */
public class VisitorB implements Visitor {
    /**
     * 對應(yīng)于NodeA的訪問操作
     */
    @Override
    public void visit(NodeA node) {
        System.out.println(node.operationA());
    }
    /**
     * 對應(yīng)于NodeB的訪問操作
     */
    @Override
    public void visit(NodeB node) {
        System.out.println(node.operationB());
    }
}

抽象節(jié)點類

/**
 * 抽象節(jié)點類
 */
public abstract class Node {
    /**
     * 接受操作
     */
    public abstract void accept(Visitor visitor);
}

具體節(jié)點類

/**
 * 具體節(jié)點類NodeA
 */
public class NodeA extends Node {
    /**
     * 接受操作
     */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    /**
     * NodeA特有的方法
     */
    public String operationA() {
        return "NodeA";
    }
}
/**
 * 具體節(jié)點類NodeB
 */
public class NodeB extends Node {
    /**
     * 接受方法
     */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    /**
     * NodeB特有的方法
     */
    public String operationB() {
        return "NodeB";
    }
}

結(jié)構(gòu)對象角色類

/**
 * 結(jié)構(gòu)對象角色類
 * 這個結(jié)構(gòu)對象角色持有一個聚集,并向外界提供add()方法作為對聚集的管理操作。通過調(diào)用這個方法,可以動態(tài)地增加一個新的節(jié)點。
 */
public class ObjectStructure {
    private List<Node> nodes = new ArrayList<Node>();
    /**
     * 執(zhí)行方法操作
     */
    public void action(Visitor visitor) {
        for (Node node : nodes) {
            node.accept(visitor);
        }
    }
    /**
     * 添加一個新元素
     */
    public void add(Node node) {
        nodes.add(node);
    }
}

客戶端代碼

public static void main(String[] args) {
        //創(chuàng)建一個結(jié)構(gòu)對象
        ObjectStructure os = new ObjectStructure();
        //給結(jié)構(gòu)增加一個節(jié)點
        os.add(new NodeA());
        //給結(jié)構(gòu)增加一個節(jié)點
        os.add(new NodeB());
        //創(chuàng)建一個訪問者
        Visitor visitor = new VisitorA();
        os.action(visitor);
    }

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java 中的volatile關(guān)鍵字

    java 中的volatile關(guān)鍵字

    這篇文章主要介紹了java 中的volatile關(guān)鍵字,volatile在多處理器開發(fā)中保證共享變量的“可見性”??梢娦缘囊馑际钱?dāng)一個線程修改一個共享變量時,另一個一個線程立馬可以讀到這個修改的值。下面我們來看看文章的具體介紹內(nèi)容吧

    2021-12-12
  • springboot單元測試兩種方法實例詳解

    springboot單元測試兩種方法實例詳解

    這篇文章主要介紹了springboot單元測試兩種方法實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • java排序去重示例分享

    java排序去重示例分享

    這篇文章主要介紹了java排序去重示例,對String strs = "ZZZ BBB AAA OOO ZZZ AAA ZZZ"計算出現(xiàn)個數(shù),排序去重,需要的朋友可以參考下
    2014-02-02
  • Java中filter用法完整代碼示例

    Java中filter用法完整代碼示例

    這篇文章主要介紹了Java中filter用法完整代碼示例,分享了瀏覽器不緩存頁面的過濾器,檢測用戶是否登陸的過濾器等相關(guān)實例,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下
    2018-01-01
  • 解釋為什么Java中“1000==1000”為false而”100==100“為true

    解釋為什么Java中“1000==1000”為false而”100==100“為true

    在日常編程中,我們經(jīng)常遇到一些看似簡單卻隱藏著復(fù)雜邏輯的問題,這篇文章主要介紹了解釋為什么Java中“1000==1000”為false而”100==100“為true,需要的朋友可以參考下
    2024-01-01
  • Java Maven settings.xml中私有倉庫配置詳解

    Java Maven settings.xml中私有倉庫配置詳解

    這篇文章主要介紹了詳解Maven settings.xml配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • Mybatis的Dao層實現(xiàn)原理分析

    Mybatis的Dao層實現(xiàn)原理分析

    這篇文章主要介紹了Mybatis的Dao層實現(xiàn)原理分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Spring SpringMVC,Spring整合MyBatis 事務(wù)配置的詳細流程

    Spring SpringMVC,Spring整合MyBatis 事務(wù)配置的詳細流程

    這篇文章給大家介紹SSM整合詳細流程步驟 Spring SpringMVC,Spring整合MyBatis 事務(wù)配置,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10
  • 關(guān)于Spring Cloud健康檢查的陷阱

    關(guān)于Spring Cloud健康檢查的陷阱

    這篇文章主要介紹了關(guān)于Spring Cloud健康檢查的陷阱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java 多線程的同步幾種方法

    java 多線程的同步幾種方法

    這篇文章主要介紹了java 多線程的同步幾種方法的相關(guān)資料,這里提供5種方法,需要的朋友可以參考下
    2017-09-09

最新評論

信丰县| 塔城市| 偏关县| 台山市| 和林格尔县| 灌南县| 牟定县| 淅川县| 普宁市| 湖南省| 碌曲县| 德江县| 扎赉特旗| 肃南| 和硕县| 岳池县| 塘沽区| 胶南市| 额济纳旗| 峨眉山市| 葵青区| 万山特区| 博兴县| 克东县| 清新县| 铁岭市| 大理市| 新竹市| 焉耆| 安塞县| 常宁市| 津市市| 永宁县| 元谋县| 大足县| 景德镇市| 惠水县| 井研县| 屏山县| 阜新市| 贺兰县|