首頁 > 軟體

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

2022-03-01 13:01:37

定義

組合模式,又叫部分整體模式,它建立了物件組的資料結構(將物件組合成樹狀結構,用來表示部分整體的層級關係)組合模式使得使用者對單個物件和組合物件的存取具有一致性

原理類圖

Component :這是組合模式中的抽象構件,他裡面定義了所有類共有的預設行為,用來存取和管理Component的子部件,Component可以是抽象類,也可以是介面

leaf :在組合模式中表示葉子節點,葉子節點沒有子節點了,他是最末端存放資料的結構

Composite:非葉子節點,下面仍然有分支,用來儲存分支,實現了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來管理自身持有的物件,這樣使用者端就可以一致處理單個物件和組合物件,遮蔽了物件層次的差異性,這樣的話,一致的行為就可以控制不同的層次了。

總結

優勢

組合模式可以使得使用者端程式碼可以一致的處理單個物件和組合物件,無須關心自己處理的是單個還是組合,遮蔽了物件系統的層次差異性,這樣的話一致的行為就可以控制不同層次了

擴充套件性非常高,可以很方便的增加葉子節點和非葉子節點,並且對於現有的類庫無侵入,滿足開閉原則

劣勢

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

使用場景

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

想體現物件的部分,整體結構的時候,可以使用組合模式,典型一點例如檔案和資料夾

到此這篇關於Java設計模式之組合模式的範例詳解的文章就介紹到這了,更多相關Java組合模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com