组合模式(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的业务逻辑
    }
}
复制代码
相关文章
相关标签/搜索