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

Java設計模式之組合模式的示例詳解

 更新時間:2022年03月01日 11:18:07   作者:溫故知新之java  
組合模式,又叫部分整體模式,它創(chuàng)建了對象組的數(shù)據(jù)結構組合模式使得用戶對單個對象和組合對象的訪問具有一致性。本文將通過示例為大家詳細介紹一下組合模式,需要的可以參考一下

定義

組合模式,又叫部分整體模式,它創(chuàng)建了對象組的數(shù)據(jù)結構(將對象組合成樹狀結構,用來表示部分整體的層級關系)組合模式使得用戶對單個對象和組合對象的訪問具有一致性

原理類圖

Component :這是組合模式中的抽象構件,他里面定義了所有類共有的默認行為,用來訪問和管理Component的子部件,Component可以是抽象類,也可以是接口

leaf :在組合模式中表示葉子節(jié)點,葉子節(jié)點沒有子節(jié)點了,他是最末端存放數(shù)據(jù)的結構

Composite:非葉子節(jié)點,下面仍然有分支,用來存儲分支,實現(xiàn)了Component 定義的默認行為

案例

需求

商場的服裝店,專賣店,衣服,褲子的關系

方案

定義組合模式的抽象構件

public abstract class Component {
    private String name;
    private String desc;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public Component(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public void add(Component component){
        throw new UnsupportedOperationException();
    }

    public void remove(Component component){
        throw new UnsupportedOperationException();
    }

    public abstract void show();
}

定義服裝商鋪類

public class Store extends Component{

    List<Component> componentList = new ArrayList<Component>();

    public Store(String name, String desc){
        super(name, desc);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDesc() {
        return super.getDesc();
    }

    @Override
    public void add(Component component) {
        System.out.println("添加:" + getName());
        componentList.add(component);
    }

    @Override
    public void remove(Component component) {
        System.out.println("移除:" + getName());
        componentList.remove(component);
    }

    @Override
    public void show() {
        for (Component component : componentList) {
            System.out.println(component.getName());
            component.show();
        }
    }
}

定義服裝專賣店商鋪

public class BrandStore extends Component{

    List<Component> componentList = new ArrayList<Component>();

    public BrandStore(String name, String desc) {
        super(name, desc);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDesc() {
        return super.getDesc();
    }

    @Override
    public void add(Component component) {
        componentList.add(component);
    }

    @Override
    public void remove(Component component) {
        componentList.remove(component);
    }

    @Override
    public void show() {
        for (Component component : componentList) {
            System.out.println(component.getName());
            component.show();
        }
    }
}

定義運動裝

public class Sportswear extends Component{

    List<Component> componentList = new ArrayList<Component>();

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDesc() {
        return super.getDesc();
    }

    public Sportswear(String name, String desc) {
        super(name, desc);
    }

    @Override
    public void add(Component component) {
        componentList.add(component);
    }

    @Override
    public void remove(Component component) {
        componentList.remove(component);
    }

    @Override
    public void show() {
        for (Component component: componentList) {
            System.out.println(component.getName());
        }
    }
}

定義測試類

public class Test {
    public static void main(String[] args) {
        // 服裝店
        Component store = new Store("服裝店","服裝店");

        // 專賣店
        Component brandStore1 = new BrandStore("李寧服裝專賣店","李寧服裝專賣店");
        Component brandStore2 = new BrandStore("361服裝專賣店","361服裝專賣店");

        // 運動裝
        Component sportswear1 = new Sportswear("運動裝","運動裝");
        Component sportswear2 = new Sportswear("休閑裝","休閑裝");

        brandStore1.add(sportswear1);
        brandStore2.add(sportswear2);

        store.add(brandStore1);
        store.add(brandStore2);
        store.show();
    }
}

查看測試結果

分析

該案例中,服裝店(Store),專賣店(BrandStore),運動裝(Sportswear)都繼承了抽象構件(Component),通過持有一個list來管理自身持有的對象,這樣客戶端就可以一致處理單個對象和組合對象,屏蔽了對象層次的差異性,這樣的話,一致的行為就可以控制不同的層次了。

總結

優(yōu)勢

組合模式可以使得客戶端代碼可以一致的處理單個對象和組合對象,無須關心自己處理的是單個還是組合,屏蔽了對象系統(tǒng)的層次差異性,這樣的話一致的行為就可以控制不同層次了

擴展性非常高,可以很方便的增加葉子節(jié)點和非葉子節(jié)點,并且對于現(xiàn)有的類庫無侵入,滿足開閉原則

劣勢

如果說各個節(jié)點有很大差異的話,不適合使用組合模式

使用場景

處理樹形結構,具備統(tǒng)一行為,建議大家使用組合模式

想體現(xiàn)對象的部分,整體結構的時候,可以使用組合模式,典型一點例如文件和文件夾

到此這篇關于Java設計模式之組合模式的示例詳解的文章就介紹到這了,更多相關Java組合模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java受檢異常的一些思考

    Java受檢異常的一些思考

    受檢異常是否真的有必要?這是一個爭論了很久的問題,至今仍然沒有一個確定的答案。Java的受檢異常,被很多人吐槽,也被很多人喜愛,當然他們都可以拿出很多的理由來證明自己的觀點。
    2020-12-12
  • Eclipse+Java+Swing實現(xiàn)學生成績管理系統(tǒng)的實例代碼

    Eclipse+Java+Swing實現(xiàn)學生成績管理系統(tǒng)的實例代碼

    這篇文章主要介紹了Eclipse+Java+Swing實現(xiàn)學生成績管理系統(tǒng),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • java實現(xiàn)的簡單猜數(shù)字游戲代碼

    java實現(xiàn)的簡單猜數(shù)字游戲代碼

    這篇文章主要介紹了java實現(xiàn)的簡單猜數(shù)字游戲代碼,通過隨機數(shù)與邏輯判斷來實現(xiàn)游戲功能,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • Java調(diào)用打印機的2種方式舉例(無驅/有驅)

    Java調(diào)用打印機的2種方式舉例(無驅/有驅)

    我們平時使用某些軟件或者在超市購物的時候都會發(fā)現(xiàn)可以使用打印機進行打印,這篇文章主要給大家介紹了關于Java調(diào)用打印機的2種方式,分別是無驅/有驅的相關資料,需要的朋友可以參考下
    2023-11-11
  • Spring Boot中使用Activiti的方法教程(二)

    Spring Boot中使用Activiti的方法教程(二)

    工作流(Workflow),就是“業(yè)務過程的部分或整體在計算機應用環(huán)境下的自動化”,下面這篇文章主要給大家介紹了關于Spring Boot中使用Activiti的相關資料,需要的朋友可以參考下
    2018-08-08
  • Mac電腦安裝多個JDK版本的詳細圖文教程

    Mac電腦安裝多個JDK版本的詳細圖文教程

    目前使用的主流版本還是JDK 8,但偶爾會想體驗下新版本(或者舊版本),如果能裝多個版本的JDK,而且很方便的切換就好了,這篇文章主要給大家介紹了關于Mac電腦安裝多個JDK版本的相關資料,需要的朋友可以參考下
    2024-03-03
  • 利用Java設置Word文本框中的文字旋轉方向的實現(xiàn)方法

    利用Java設置Word文本框中的文字旋轉方向的實現(xiàn)方法

    Word文檔中可添加文本框,并設置文本框為橫向文本排列或是縱向文本排列,或者設置文本框中的文字旋轉方向等.通過Java程序代碼,也可以實現(xiàn)以上文本框的操作.下面以Java代碼示例展示具體的實現(xiàn)步驟.另外,可參考C#及VB.NET代碼的實現(xiàn)方法,需要的朋友可以參考下
    2021-06-06
  • Kafka之kafka-topics.sh的使用解讀

    Kafka之kafka-topics.sh的使用解讀

    這篇文章主要介紹了Kafka之kafka-topics.sh的使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java字符串技巧之刪除標點或最后字符的方法

    Java字符串技巧之刪除標點或最后字符的方法

    這篇文章主要介紹了Java字符串技巧之刪除標點或最后字符的方法,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • Java?InputStream實戰(zhàn)之輕松讀取操作文件流

    Java?InputStream實戰(zhàn)之輕松讀取操作文件流

    在Java中,輸入輸出是非常重要的基礎功能,其中,InputStream是Java中的一個重要輸入流類,用于從輸入源讀取數(shù)據(jù),下面我們就來學習一下InputStream類的相關知識吧
    2023-10-10

最新評論

闽侯县| 义马市| 黑龙江省| 维西| 南京市| 佛坪县| 乌兰浩特市| 宁蒗| 安顺市| 澜沧| 宣武区| 乌兰浩特市| 惠东县| 黎平县| 阳谷县| 昭觉县| 陆河县| 天长市| 仪征市| 肥西县| 淄博市| 扬中市| 巴塘县| 高平市| 平阴县| 鄂托克前旗| 锡林郭勒盟| 哈巴河县| 舟山市| 竹山县| 乌拉特后旗| 平利县| 阳城县| 溧水县| 淮滨县| 阿瓦提县| 双辽市| 东平县| 普格县| 井研县| 县级市|