亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java合成模式之神奇的樹(shù)結(jié)構(gòu)

 更新時(shí)間:2021年08月25日 17:19:29   作者:二當(dāng)家的白帽子  
這篇文章主要介紹了java合成模式,文中運(yùn)用大量的代碼進(jìn)行詳細(xì)講解,希望大家看完本文后能學(xué)習(xí)到相關(guān)的知識(shí),需要的朋友可以參考一下

什么是合成模式

以下是互聯(lián)網(wǎng)的解釋。

合成模式屬于對(duì)象的結(jié)構(gòu)模式,有時(shí)又叫做“部分——整體”模式。合成模式將對(duì)象組織到樹(shù)結(jié)構(gòu)中,可以用來(lái)描述整體與部分的關(guān)系。合成模式可以使客戶端將單純?cè)嘏c復(fù)合元素同等看待。

經(jīng)常會(huì)出現(xiàn)有樹(shù)結(jié)構(gòu)的情況 , 其中由單獨(dú)的對(duì)象或者單獨(dú)對(duì)象組成的合成對(duì)象組成 , 此時(shí)就需要利用一種方式來(lái)完成樹(shù)結(jié)構(gòu)的構(gòu)建工作 .
合成模式提供一個(gè)樹(shù)結(jié)構(gòu)中所有對(duì)象的統(tǒng)一接口 , 規(guī)范樹(shù)中單獨(dú)對(duì)象和合成對(duì)象的構(gòu)建過(guò)程 , 合成模式更像一個(gè)數(shù)據(jù)結(jié)構(gòu) .

合成模式的實(shí)現(xiàn)方式分為透明式和安全式 , 主要區(qū)別在于管理方法是在抽象構(gòu)件中聲明, 還是直接在樹(shù)枝構(gòu)件中定義.

  • 透明式 , 管理方法在抽象構(gòu)件中聲明 , 同時(shí)樹(shù)葉節(jié)點(diǎn)需要用平庸的方式實(shí)現(xiàn)管理方法
  • 安全式 , 在樹(shù)枝構(gòu)件中直接定義管理方法 , 這樣避免在樹(shù)葉構(gòu)件中進(jìn)行定義 .

設(shè)計(jì)模式和編程語(yǔ)言無(wú)關(guān),但是二當(dāng)家的依然用Java語(yǔ)言去實(shí)戰(zhàn)舉例。


安全式合成模式

在這里插入圖片描述

  • 抽象構(gòu)件(Component)角色:這是一個(gè)抽象角色,它給參加組合的對(duì)象定義出公共的接口及其默認(rèn)行為,可以用來(lái)管理所有的子對(duì)象。合成對(duì)象通常把它所包含的子對(duì)象當(dāng)做類型為Component的對(duì)象。在安全式的合成模式里,構(gòu)件角色并不定義出管理子對(duì)象的方法,這一定義由樹(shù)枝構(gòu)件對(duì)象給出。
  • 樹(shù)葉構(gòu)件(Leaf)角色:樹(shù)葉對(duì)象沒(méi)有下級(jí)子對(duì)象,定義出參加組合的原始對(duì)象的行為。
  • 樹(shù)枝構(gòu)件(Composite)角色:代表參加組合的有下級(jí)子對(duì)象的對(duì)象,并給出樹(shù)枝構(gòu)件對(duì)象的行為。

抽象構(gòu)件(Component)角色

抽象構(gòu)件聲明了葉子和樹(shù)枝都應(yīng)該有的行為。

package com.secondgod.composite;

/**
 * 抽象構(gòu)件
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public interface Component {
    /**
     * 輸出自身的名稱
     */
    void printStruct(String preStr);
}

樹(shù)葉構(gòu)件(Leaf)角色

樹(shù)葉不會(huì)再有下級(jí)。

package com.secondgod.composite;

import java.text.MessageFormat;

/**
 * 樹(shù)葉
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Leaf implements Component {
    /**
     * 葉子對(duì)象的名字
     */
    private String name;

    public Leaf(String name) {
        this.name = name;
    }

    @Override
    public void printStruct(String preStr) {
        System.out.println(MessageFormat.format("{0}-{1}", preStr, name));
    }
}

樹(shù)枝構(gòu)件(Composite)角色

樹(shù)枝可以繼續(xù)長(zhǎng)出樹(shù)枝或者樹(shù)葉,所以要有addChild方法。

package com.secondgod.composite;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 樹(shù)枝
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Composite implements Component {
    /**
     * 用來(lái)存儲(chǔ)組合對(duì)象中包含的子組件對(duì)象
     */
    private List<Component> childComponents = new ArrayList<Component>();
    /**
     * 組合對(duì)象的名字
     */
    private String          name;

    public Composite(String name){
        this.name = name;
    }

    /**
     * 聚集管理方法,增加一個(gè)子構(gòu)件對(duì)象
     * @param child 子構(gòu)件對(duì)象
     */
    public void addChild(Component child){
        childComponents.add(child);
    }

    @Override
    public void printStruct(String preStr) {
        // 先把自己輸出
        System.out.println(MessageFormat.format("{0}+{1}", preStr, name));

        // 如果還包含有子組件,那么就輸出這些子組件對(duì)象
        if (this.childComponents != null) {
            // 添加兩個(gè)空格,表示向后縮進(jìn)兩個(gè)空格
            preStr += "  ";
            // 輸出當(dāng)前對(duì)象的子對(duì)象
            for (Component c : childComponents) {
                // 遞歸輸出每個(gè)子對(duì)象
                c.printStruct(preStr);
            }
        }
    }
}

使用

package com.secondgod.composite;

/**
 * 測(cè)試
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Client {

    public static void main(String[]args){
        Composite root = new Composite("生物");
        Composite c1 = new Composite("動(dòng)物");
        Composite c2 = new Composite("植物");

        Leaf leaf1 = new Leaf("貓貓");
        Leaf leaf2 = new Leaf("狗狗");
        Leaf leaf3 = new Leaf("大樹(shù)");
        Leaf leaf4 = new Leaf("小草");

        root.addChild(c1);
        root.addChild(c2);
        c1.addChild(leaf1);
        c1.addChild(leaf2);
        c2.addChild(leaf3);
        c2.addChild(leaf4);

        root.printStruct("");
    }
}

在這里插入圖片描述

執(zhí)行結(jié)果符合預(yù)期。


透明式合成模式

在這里插入圖片描述


抽象構(gòu)件(Component)角色

生長(zhǎng)樹(shù)枝和樹(shù)葉的方法直接聲明在抽象構(gòu)件里。本例使用抽象類,其實(shí)也可以使用接口。

package com.secondgod.composite;

/**
 * 抽象構(gòu)件
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public abstract class Component {
    /**
     * 輸出自身的名稱
     */
    public abstract void printStruct(String preStr);

    /**
     * 聚集管理方法,增加一個(gè)子構(gòu)件對(duì)象
     * @param child 子構(gòu)件對(duì)象
     */
    public void addChild(Component child){
        /**
         * 缺省實(shí)現(xiàn),拋出異常,因?yàn)槿~子對(duì)象沒(méi)有此功能
         * 或者子組件沒(méi)有實(shí)現(xiàn)這個(gè)功能
         */
        throw new UnsupportedOperationException("對(duì)象不支持此功能");
    }
}

樹(shù)葉構(gòu)件(Leaf)角色

透明式的葉子從實(shí)現(xiàn)抽象構(gòu)件改成繼承抽象構(gòu)件。如果抽象構(gòu)件是接口,則需要平庸實(shí)現(xiàn)管理子構(gòu)件的方法。

package com.secondgod.composite;

import java.text.MessageFormat;

/**
 * 樹(shù)葉
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Leaf extends Component {
    /**
     * 葉子對(duì)象的名字
     */
    private String name;

    public Leaf(String name) {
        this.name = name;
    }

    @Override
    public void printStruct(String preStr) {
        System.out.println(MessageFormat.format("{0}-{1}", preStr, name));
    }
}

樹(shù)枝構(gòu)件(Composite)角色

透明式的樹(shù)枝也是從實(shí)現(xiàn)抽象構(gòu)件改為繼承抽象構(gòu)件,這主要跟抽象構(gòu)件是抽象類還是接口有關(guān)。

package com.secondgod.composite;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 樹(shù)枝
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Composite extends Component {
    /**
     * 用來(lái)存儲(chǔ)組合對(duì)象中包含的子組件對(duì)象
     */
    private List<Component> childComponents = new ArrayList<Component>();
    /**
     * 組合對(duì)象的名字
     */
    private String          name;

    public Composite(String name){
        this.name = name;
    }

    /**
     * 聚集管理方法,增加一個(gè)子構(gòu)件對(duì)象
     * @param child 子構(gòu)件對(duì)象
     */
    public void addChild(Component child){
        childComponents.add(child);
    }

    @Override
    public void printStruct(String preStr) {
        // 先把自己輸出
        System.out.println(MessageFormat.format("{0}+{1}", preStr, name));

        // 如果還包含有子組件,那么就輸出這些子組件對(duì)象
        if (this.childComponents != null) {
            // 添加兩個(gè)空格,表示向后縮進(jìn)兩個(gè)空格
            preStr += "  ";
            // 輸出當(dāng)前對(duì)象的子對(duì)象
            for (Component c : childComponents) {
                // 遞歸輸出每個(gè)子對(duì)象
                c.printStruct(preStr);
            }
        }
    }
}

使用

客戶端在使用時(shí),變量可以都聲明為抽象構(gòu)件。

package com.secondgod.composite;

/**
 * 測(cè)試
 *
 * @author 二當(dāng)家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Client {

    public static void main(String[]args){
        Component root = new Composite("生物");
        Component c1 = new Composite("動(dòng)物");
        Component c2 = new Composite("植物");

        Component leaf1 = new Leaf("貓貓");
        Component leaf2 = new Leaf("狗狗");
        Component leaf3 = new Leaf("大樹(shù)");
        Component leaf4 = new Leaf("小草");

        root.addChild(c1);
        root.addChild(c2);
        c1.addChild(leaf1);
        c1.addChild(leaf2);
        c2.addChild(leaf3);
        c2.addChild(leaf4);

        root.printStruct("");
    }
}

可以看出,客戶端無(wú)需再區(qū)分操作的是樹(shù)枝對(duì)象(Composite)還是樹(shù)葉對(duì)象(Leaf)了;對(duì)于客戶端而言,操作的都是Component對(duì)象。


安全式和透明式

安全式:從客戶端使用合成模式上看是否更安全,如果是安全的,那么就不會(huì)有發(fā)生誤操作的可能,能訪問(wèn)的方法都是被支持的。

透明式:從客戶端使用合成模式上,是否需要區(qū)分到底是“樹(shù)枝對(duì)象”還是“樹(shù)葉對(duì)象”。如果是透明的,那就不用區(qū)分,對(duì)于客戶而言,都是Compoent對(duì)象,具體的類型對(duì)于客戶端而言是透明的,是無(wú)須關(guān)心的。因?yàn)闊o(wú)論樹(shù)葉還是樹(shù)枝,均符合一個(gè)固定的接口。

到底使用安全式還是透明式需要看需求,大家看著辦吧。


以上就是java合成模式之神奇的樹(shù)結(jié)構(gòu)的詳細(xì)內(nèi)容,更多關(guān)于java合成模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring?Security中的CORS詳解

    Spring?Security中的CORS詳解

    CORS(Cross-Origin?Resource?Sharing)是一種允許不同源之間進(jìn)行資源共享的W3C標(biāo)準(zhǔn),它通過(guò)在服務(wù)器端設(shè)置特定的HTTP響應(yīng)頭,實(shí)現(xiàn)了跨域請(qǐng)求的功能,這種機(jī)制要求瀏覽器和服務(wù)器的支持,本文給大家介紹Spring?Security中的CORS,感興趣的朋友一起看看吧
    2024-10-10
  • springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案

    springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案

    這篇文章主要介紹了springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java的ThreadPoolExecutor業(yè)務(wù)線程池詳細(xì)解析

    Java的ThreadPoolExecutor業(yè)務(wù)線程池詳細(xì)解析

    這篇文章主要介紹了Java線程池ThreadPoolExecutor詳細(xì)解析,任務(wù)剛開(kāi)始進(jìn)來(lái)的時(shí)候就創(chuàng)建核心線程,核心線程滿了會(huì)把任務(wù)放到阻塞隊(duì)列,阻塞隊(duì)列滿了之后才會(huì)創(chuàng)建空閑線程,達(dá)到最大線程數(shù)之后,再有任務(wù)進(jìn)來(lái),就只能執(zhí)行拒絕策略了,需要的朋友可以參考下
    2024-01-01
  • 詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù)

    詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù)

    本篇文章主要介紹了詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • SpringBoot實(shí)現(xiàn)子類的反序列化示例代碼

    SpringBoot實(shí)現(xiàn)子類的反序列化示例代碼

    這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)子類的反序列化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓?wèn)題復(fù)盤(pán)

    MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓?wèn)題復(fù)盤(pán)

    這篇文章主要介紹了MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓?wèn)題復(fù)盤(pán),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • IDEA中使用Docker Compose容器編排的實(shí)現(xiàn)

    IDEA中使用Docker Compose容器編排的實(shí)現(xiàn)

    這篇文章主要介紹了IDEA中使用Docker Compose容器編排的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java多種經(jīng)典排序算法(含動(dòng)態(tài)圖)

    Java多種經(jīng)典排序算法(含動(dòng)態(tài)圖)

    排序算法是老生常談的了,但是在面試中也有會(huì)被問(wèn)到,例如有時(shí)候,在考察算法能力的時(shí)候,不讓你寫(xiě)算法,就讓你描述一下,某個(gè)排序算法的思想以及時(shí)間復(fù)雜度或空間復(fù)雜度。我就遇到過(guò),直接問(wèn)快排的,所以這次我就總結(jié)梳理一下經(jīng)典的十大排序算法以及它們的模板代碼
    2021-04-04
  • java實(shí)現(xiàn)高效下載文件的方法

    java實(shí)現(xiàn)高效下載文件的方法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)高效下載文件的幾種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java設(shè)計(jì)模式之外觀模式(Facade)

    java設(shè)計(jì)模式之外觀模式(Facade)

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之外觀模式Facade的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論