组合模式

2020-06-18  本文已影响0人  nieniemin

什么是组合模式

(Composite:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

模式角色

组合部件(Component:组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
Leaf叶子(File):叶子对象,叶子结点没有子结点。
Composite合成部件(Folder):容器对象,定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

UML类图

组合模式

代码实现

梳理下定义,组合模式又叫部分-整体模式;将对象组合成树状的层次结构的模式。生活中公司/部门/分公司,文件夹/文件/文件夹/....这都是树状结构。代码中通过文件/文件夹来实现组合模式。

public interface Component {

    void display();

    void add(Component component);

    void remove(Component component);
}

public class File implements Component {

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

    @Override
    public void display() {
        System.out.println("叶子节点,文件名:" + name);
    }

    @Override
    public void add(Component component) {

    }

    @Override
    public void remove(Component component) {

    }
}
public class Folder implements Component {

    // 组合模式的核心思想了。文件和文件夹是一种"部分-整体"的关系,文件夹里面既可以包含文件,
    // 也可以包含文件夹,而包含的文件夹里面又可以包含文件和文件夹.....
    private List<Component> list = new ArrayList<>();
    private String name;
    public Folder(String name) {
        this.name = name;
    }

    @Override
    public void add(Component component) {
        list.add(component);
    }

    @Override
    public void remove(Component component) {
        list.remove(component);
    }

    @Override
    public void display() {
        System.out.println("文件夹名称:"+name);
        for (Component component : list) {
            component.display();
        }
    }
}
public class Client {
    public static void main(String[] args) {

        Folder folder = new Folder("design");
        Folder folder2 = new Folder("composite");
        folder.add(folder2);

        File file = new File("Component.java");
        File file2 = new File("File.java");
        File file3 = new File("Folder.java");

        folder.add(file);
        folder.add(file2);
        folder.add(file3);
        folder.display();
    }
}

文件夹名称:design
文件夹名称:composite
叶子节点,文件名:Component.java
叶子节点,文件名:File.java
叶子节点,文件名:Folder.java

优点
组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”
缺点
设计较复杂,客户端需要花更多时间理清类之间的层次关系;
不容易限制容器中的构件;
不容易用继承的方法来增加构件的新功能;
组合模式完整代码

上一篇 下一篇

猜你喜欢

热点阅读