組合模式(Composite)

一、概念編程

組合模式將對象組合成樹形結構以表示「部分-總體」的層次結構。它使得客戶對單個對象和複合對象的使用具備一致性,屬於結構性模式。 bash

組合模式

二、模式結構ide

  • Component:組合中的對象聲明接口,實現全部類共有接口的默認行爲,聲明一個接口用於訪問和管理Component子部件
  • Leaf:葉子對象,葉子結點沒有子結點
  • Composite:容器對象,定義有枝節點行爲,用來存儲子部件,在Component接口中實現與子部件有關操做

三、使用場景ui

  • 表示對象的部分-總體層次結構
  • 讓客戶可以忽略不一樣對象層次的變化,客戶端能夠針對抽象構件編程,無須關心對象層次結構的細節

四、優缺點this

優勢:spa

  • 能夠清楚地定義分層次的複雜對象,表示對象的所有或部分層次,使得增長新構件也更容易
  • 客戶端調用簡單,客戶端能夠一致的使用組合結構或其中單個對象
  • 更容易在組合體內加入對象構件,客戶端沒必要由於加入了新的對象構件而更改原有代碼

缺點:設計

  • 在使用組合模式時,其葉子和樹枝的聲明都是實現類,而不是接口,違反了依賴倒置原則
  • 使設計變得更加抽象

五、實例code

public abstract class File {
    private String name;

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

    public String getName() {
        return name;
    }

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

    public abstract void display();
}
複製代碼
public class Folder extends File {

    private List<File> files;

    public Folder(String name) {
        super(name);
        files = new ArrayList<>();
    }

    @Override
    public void display() {
        for (File file : files) {
            file.display();
        }
    }

    public void add(File file) {
        files.add(file);
    }

    public void remove(File file){
        files.remove(file);
    }
}
複製代碼
public class ImageFile extends File {

    public ImageFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        // image的業務邏輯
    }
}
複製代碼
public class TextFile extends File {

    public TextFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        // text的業務邏輯
    }
}
複製代碼
相關文章
相關標籤/搜索