欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計模式之組合模式的示例詳解

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

定義

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

原理類圖

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

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

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

案例

需求

商場的服裝店,專賣店,衣服,褲子的關(guān)系

方案

定義組合模式的抽象構(gòu)件

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

查看測試結(jié)果

分析

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

總結(jié)

優(yōu)勢

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

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

劣勢

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

使用場景

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

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

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

相關(guān)文章

  • Java中的concurrenthashmap集合詳細(xì)剖析

    Java中的concurrenthashmap集合詳細(xì)剖析

    這篇文章主要介紹了Java中的concurrenthashmap集合詳細(xì)剖析,有參構(gòu)造后第一次put時會進行初始化,由源碼可知,會先判斷所傳入的容量是否>=最大容量的一半,如果滿足條件,就會將容量修改為最大值,反之則會將容量改為所傳入數(shù)*1.5+1,需要的朋友可以參考下
    2023-11-11
  • mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況

    mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況

    這篇文章主要介紹了mac下修改idea的jvm運行參數(shù)解決idea卡頓的情況,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 解決springboot中配置過濾器以及可能出現(xiàn)的問題

    解決springboot中配置過濾器以及可能出現(xiàn)的問題

    這篇文章主要介紹了解決springboot中配置過濾器以及可能出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 解決springboot 連接 mysql 時報錯 using password: NO的方案

    解決springboot 連接 mysql 時報錯 using password: NO的方案

    在本篇文章里小編給大家整理了關(guān)于解決springboot 連接 mysql 時報錯 using password: NO的方案,有需要的朋友們可以學(xué)習(xí)下。
    2020-01-01
  • 從dubbo zookeeper注冊地址提取出zookeeper地址的方法

    從dubbo zookeeper注冊地址提取出zookeeper地址的方法

    今天小編就為大家分享一篇關(guān)于從dubbo zookeeper注冊地址提取出zookeeper地址的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 簡單講解java中throws與throw的區(qū)別

    簡單講解java中throws與throw的區(qū)別

    這篇文章主要介紹了簡單講解java中throws與throw的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java 同步鎖(synchronized)詳解及實例

    Java 同步鎖(synchronized)詳解及實例

    這篇文章主要介紹了Java 同步鎖(synchronized)詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • java微信開發(fā)API第四步 微信自定義個性化菜單實現(xiàn)

    java微信開發(fā)API第四步 微信自定義個性化菜單實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了java微信開發(fā)API第四步,自定義菜單以及個性化菜單實現(xiàn) ,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java雇員管理小項目

    Java雇員管理小項目

    這篇文章主要為大家詳細(xì)介紹了Java雇員管理小項目,理解面向?qū)ο缶幊?,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot異常錯誤頁面實現(xiàn)方法介紹

    SpringBoot異常錯誤頁面實現(xiàn)方法介紹

    在項目訪問的時候我們經(jīng)常會發(fā)生錯誤或者頁面找不到,比如:資源找不到404,服務(wù)器500錯誤,默認(rèn)情況下springboot的處理機制都是去跳轉(zhuǎn)內(nèi)部的錯誤地址:/error 和與之對應(yīng)的一個錯誤頁面
    2022-09-09

最新評論