设计模式之组合模式

简介: 设计模式之组合模式

组合模式:其实组合模式就是一个“部分-整体”的层次结构,并且每个节点提供的功能都差不多,这样可以使使用者在使用的时候具有一致性。

代码实现

这里有三种角色: 根节点(红色)、树枝节点(橙色)、叶子结点(绿色)


江苏公司总部包含人事部和财务部,下属两个分部也包含人事部和财务部,这时候就可以使用组合模式。

我们先看一下组合模式怎么进行类设计

这里我们需要设计一个节点通用接口,用来提供给客户端进行使用。

然后根节点和树枝节点其实在功能上是一致的,都包含添加、删除、展示节点。

而叶子节点下面没有节点了,所有只需要展示节点就可以了。

public abstract class Component {
    protected String name;
    public Component(String name) {
        this.name = name;
    }
    //增加一个叶子构件或树枝构件
    public abstract void add(Component component);
    //删除一个叶子构件或树枝构件
    public abstract void remove(Component component);
    //获取分支下的所有叶子构件和树枝构件
    public abstract void display(int depth);
}
public class Composite extends Component {
    public Composite(String name) {
        super(name);
    }
    //构建容器
    private ArrayList<Component> componentArrayList = new ArrayList<Component>();
    @Override
    public void add(Component component) {
        this.componentArrayList.add(component);
    }
    @Override
    public void remove(Component component) {
        this.componentArrayList.remove(component);
    }
    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print('-');
        }
        System.out.println(name);
        for (Component component : componentArrayList) {
            component.display(depth + 1);
        }
    }
}
public class Leaf extends Component {
    public Leaf(String name) {
        super(name);
    }
    @Override
    public void add(Component component) {
        //空实现,抛出“不支持请求”异常
        throw new UnsupportedOperationException();
    }
    @Override
    public void remove(Component component) {
        //空实现,抛出“不支持请求”异常
        throw new UnsupportedOperationException();
    }
    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print('-');
        }
        System.out.println(name);
    }
}
public class Client {
    public static void main(String[] args) {
        Composite root = new Composite("江苏公司总部");
        root.add(new Leaf("人事部"));
        root.add(new Leaf("财务部"));
        Composite branch = new Composite("南京分部");
        branch.add(new Leaf("人事部"));
        branch.add(new Leaf("财务部"));
        root.add(branch);
        Composite branch2 = new Composite("苏州分部");
        branch2.add(new Leaf("人事部"));
        branch2.add(new Leaf("财务部"));
        root.add(branch2);
        root.display(1);
    }
}

结果为:

-江苏公司总部
--人事部
--财务部
--南京分部
---人事部
---财务部
--苏州分部
---人事部
---财务部

优缺点

优点

(1) 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。

(2) 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。

(3) 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。

(4) 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

缺点

在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。

适用场景

(1) 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。

(2) 在一个使用面向对象语言开发的系统中需要处理一个树形结构。

(3) 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

参考博客:https://blog.csdn.net/zhulongxi/article/details/52659043?

utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3

相关文章
|
4月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 组合模式
js设计模式【详解】—— 组合模式
52 7
|
2月前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
2月前
|
设计模式 存储 安全
Java设计模式-组合模式(13)
Java设计模式-组合模式(13)
|
5月前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
|
5月前
|
设计模式 Java
Java设计模式之组合模式详解
Java设计模式之组合模式详解
|
5月前
|
设计模式
组合模式-大话设计模式
组合模式-大话设计模式
|
6月前
|
设计模式 Java 容器
【设计模式系列笔记】组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树状结构以表示部分-整体的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而无需区分它们的类型。
88 12
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~组合模式
[设计模式 Go实现] 结构型~组合模式
|
6月前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
|
6月前
|
设计模式 Java
【设计模式】文件目录管理是组合模式吗?
【设计模式】文件目录管理是组合模式吗?
41 0