组合模式(Composite)

1、概念

组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性,属于结构性模式。
组合模式

2、模式结构

  • Component:组合中的对象声明接口,实现所有类共有接口的默认行为,声明一个接口用于访问和管理Component子部件
  • Leaf:叶子对象,叶子结点没有子结点
  • Composite:容器对象,定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作

3、使用场景

  • 表示对象的部分-整体层次结构
  • 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节

4、优缺点

优点:

  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易
  • 客户端调用简单,客户端可以一致的使用组合结构或其中单个对象
  • 更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码

缺点:

  • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
  • 使设计变得更加抽象

5、实例

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的业务逻辑
    }
}
posted @ 2018-11-12 11:03  fomin  阅读(250)  评论(0编辑  收藏  举报