设计模式-组合模式

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

场景

编写程序展示一个学校的院系结构:

要在一个页面中展示出学校的院系组成 一个学校有多个学院 一个学院有多个系

如同一个树状结构一样管理多个对象
传统方案解决存在的问题

(1) 将学院看做是学校的子类 系是学院的子类 这样实际上是站在组织大小来进行分层次的

(2) 实际上的要求是: 在一个页面中展示出学校的院系组成 一个学校有多个学院 一个学院有多个系 因此这种方案 不能很好的实现管理的操作 比如对学院 系的添加 删除 遍历等

(3) 解决方案: 把学校 院 系都看做是组织结构 他们之间没有继承的关系 而是一个树形结构 可以更好的实现管理操作
介绍

(1) 组合模式(Composite Pattern) 也称部分整体模式 它创建了对象组的树形结构 将对象组合成树状结构以表示;"整体-部分"的层次关系

(2) 组合模式依据树形结构来组合对象 用来表示部分以及整体层次

(3) 这种类型地设计模式属于结构型模式

(4) 组合模式使得用户对单个对象和组合对象的访问具有一致性 即:组合能让客户以一致的方式处理个别对象以及组合对象
组合模式解决的问题

当我们要处理的对象可以生成一颗树形结构 而我们要对树上的节点和叶子进行操作时 它能够提供一致的方式 而不用去考虑它是节点还是叶子
代码演示

创建最顶层抽象类
@Data
public abstract class OrganizationComponent {
//名字
private String name;

//说明
private String des;

protected  void add(OrganizationComponent org){
    //默认实现
    throw new UnsupportedOperationException();
}

protected  void remove(OrganizationComponent org){
    //默认实现
    throw new UnsupportedOperationException();
}

//方法 print 设置抽象 子类都需要实现该方法
protected  abstract  void print();

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

}
学校子类实现
public class University extends OrganizationComponent {

//聚合
List<OrganizationComponent> orgs = new ArrayList<>();

@Override
protected void add(OrganizationComponent org) {
    orgs.add(org);
}

@Override
protected void remove(OrganizationComponent org) {
    orgs.remove(org);
}

/**
 * print方法 就是直接输入UNiversity包含的学院
 */
@Override
protected void print() {
    System.out.println("============== "+ getName()+" ==================");
    //遍历 orgs
    orgs.forEach(item-> item.print());

}

public University(String name, String des) {
    super(name, des);

}

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

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

@Override
public void setName(String name) {
    super.setName(name);
}

@Override
public void setDes(String des) {
    super.setDes(des);
}

}
部门子类实现
public class Department extends OrganizationComponent{

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

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

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

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

@Override
public void setName(String name) {
    super.setName(name);
}

@Override
public void setDes(String des) {
    super.setDes(des);
}

}
测试
public static void main(String[] args) {
//从大到消创建对象 学校->学院->部门
//创建学校
OrganizationComponent university = new University("武汉大学","中国一流大学");
//创建学院
OrganizationComponent computeCpllege = new College("计算机学院","计算机系");
OrganizationComponent softwareCollege = new College("软件学院","计算机系");
//创建各个学院下面的系(专业)
computeCpllege.add(new Department("软件工程","软件工程很好"));
computeCpllege.add(new Department("电子信息科学","电子信息网络数据"));
computeCpllege.add(new Department("计算机科学与技术","很多人都喜欢报的专业"));
softwareCollege.add(new Department("软件技术","软件技术专业女生多哦"));
softwareCollege.add(new Department("通信工程","通信要学硬件的"));

    //将学院加入到学校
    university.add(computeCpllege);
    university.add(softwareCollege);

    System.out.println("学校所有信息");
    university.print();
    System.out.println("分割线------------------------------------------------------->");
    System.out.println("计算机学院所有信息");
    computeCpllege.print();
    System.out.println("分割线------------------------------------------------------->");


}

组合模式的注意事项和细节

(1) 简化客户端的操作 客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题

(2) 具有较强的扩展性 当我们要更改组合对象时 我们只需要调整内部的层次关系 客户端不用做出任何改动

(3) 方便创建出复杂的层次结构 客户端不用理会组合里面的组成细节 容易调价节点或者叶子从而创建出复杂的树形结构

(4) 需要遍历组织结构 或者处理的对象具有树形结构时 非常是适合使用组合模式

(5) 要求较高的抽象性 如果节点和叶子有很多差异性的话 比如很多方法和属性都不一样 就不适合使用组合模式

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