23种设计模式——组合模式

简介: 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

组合模式

今天来学习23种设计模式的组合模式,组合模式主要用于组合多个对象形成树形结构以表示“整体-部分”的结构层次。
概念:

组合模式(Composite Pattern)又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型设计模式。

特点:

优点:

  • 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码。
  • 容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。

缺点:

  • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
代码:
package cn.ppdxzz.composite;
/**
 * Description:抽象类,实现所有类共有的接口默认行为
 *
 * @Date: 2020/4/8
 * @Author: PeiChen JavaAnything
 */
public abstract class OrganizationComponent {
    private String name;//名称
    private String description;//描述

    protected void add(OrganizationComponent organizationComponent) {
        //默认实现
        throw new UnsupportedOperationException();
    }
    protected void remove(OrganizationComponent organizationComponent) {
        //默认实现
        throw new UnsupportedOperationException();
    }
    //抽象方法,子类都需实现
    protected abstract void print();

    public OrganizationComponent() {
    }

    public OrganizationComponent(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

系别

package cn.ppdxzz.composite;

/**
 * Description:系别
 *
 * @Date: 2020/4/8
 * @Author: PeiChen JavaAnything
 */
public class Department extends OrganizationComponent {

    public Department(String name, String description) {
        super(name, description);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDescription() {
        return super.getDescription();
    }

    @Override
    protected void print() {
        System.out.println(getName());
    }
}

学院

package cn.ppdxzz.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * Description:学院
 *
 * @Date: 2020/4/8
 * @Author: PeiChen JavaAnything
 */
public class College extends OrganizationComponent {
    //List集合用于存放系别
    List<OrganizationComponent> organizationComponents = new ArrayList<>();

    public College(String name,String description) {
        super(name, description);
    }
    //添加系别
    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }
    //移除系别
    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }
    //输出系别信息
    @Override
    protected void print() {
        System.out.println("---" + getName() + "---");
        organizationComponents.forEach(OrganizationComponent::print);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDescription() {
        return super.getDescription();
    }
}

学校

package cn.ppdxzz.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * Description:学校
 *
 * @Date: 2020/4/8
 * @Author: PeiChen JavaAnything
 */
public class University extends OrganizationComponent {
    //List集合存放College学院
    List<OrganizationComponent> organizationComponents = new ArrayList<>();
    public University(String name,String description) {
        super(name, description);
    }
    //添加学院
    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }
    //删除学院
    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }
    //输出学院信息
    @Override
    protected void print() {
        System.out.println("---" + getName() + "---");
        organizationComponents.forEach(OrganizationComponent::print);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDescription() {
        return super.getDescription();
    }
}

测试

package cn.ppdxzz.composite;

/**
 * Description:组合模式(学校院系展示问题)
 *
 * @Date: 2020/4/8
 * @Author: PeiChen JavaAnything
 */
public class Client {
    public static void main(String[] args) {
        //创建学校
        OrganizationComponent university = new University("大学","大学很美");
        //创建学院
        OrganizationComponent college1 = new College("电子信息工程学院","这是计算机学院");
        OrganizationComponent college2 = new College("外语学院","这是外语学院");
        //创建各个学院下面的系别
        college1.add(new Department("计科系","它很强"));
        college1.add(new Department("电子系","它很强"));
        college2.add(new Department("英语系","这是英语系"));
        college2.add(new Department("韩语系","这是韩语系"));
        //添加学院到学校
        university.add(college1);
        university.add(college2);
        university.print();



    }
}
总结:
  • 简化客户端的操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
  • 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动。
  • 需要遍历组织机构,或者处理的对象具有树形结构时,非常适合使用组合模式。
  • 组合模式要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式。
  • Java 的集合类 HashMap 中就使用到了组合模式。
虽然组合模式能够清晰地定义分层次的复杂对象,也使得增加新构件也更容易,但是这样就导致了系统的设计变得更加抽象,如果系统的业务规则比较复杂的话,使用组合模式就有一定的挑战了。
目录
相关文章
|
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)是一种结构型设计模式,它允许将对象组合成树状结构以表示部分-整体的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而无需区分它们的类型。
85 12
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~组合模式
[设计模式 Go实现] 结构型~组合模式
|
6月前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
|
6月前
|
设计模式 Java
【设计模式】文件目录管理是组合模式吗?
【设计模式】文件目录管理是组合模式吗?
41 0

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75