您当前的位置:首页 > 电脑百科 > 程序开发 > 程序员

程序员必备技能:设计模式之——组合模式

时间:2020-09-08 10:40:54  来源:  作者:

什么是组合模式

“组合模式”也被称为“部分整体模式”该模式属于结构型模式的一种。

讲解该模式之前先带大家熟悉一下“树形结构”。相信大家对“树形结构”不会太陌生,如果你刚好不太了解的话可以想一下大树,一颗树它分别有树根、树枝、树叶,正好树形结构中也有根节点、子节点(非叶子节点)、叶子节点。

程序员必备技能:设计模式之——组合模式

 

组合模式就运用了树形结构,该模式的核心思想是:将多个对象组合成树形结构,以此结构来表示“整体-部分”之间的层次关系。

组合模式UML类图

 

程序员必备技能:设计模式之——组合模式

 

UML类图讲解:

1、Component:组合模式中的“根节点”,可以是接口、抽象类、普通类,该类中定义了其子类的所有共性内容,并且该类中还存在着用于访问和管理它子部件的方法。
2、Leaf:组合中的叶子节点,也就是最末端的节点,该节点下不会再有子节点。
3、Composite:非叶子节点,它的作用是存储子部件,并且在Composite中实现了对子部件的相关操作。

通过案例了解组合模式

案例:某公司老板需要开发一个人员和部门管理系统,要求是可以灵活的新增、删除、展示部门以及部门下的员工。此时我们就可以通过组合模式来实现。

组织构成 => 对应Component角色

public abstract class OrganizationComponent {
  // 名称
  private String name;
  // 描述
  private String describe;
  /**
   * 显示方法
   * 该方法不论是子节点还是叶子节点都需要,所以将其设计成抽象方法让子类自行实现。
   */
  public abstract void show();
  /**
   * 新增方法
   * 因为叶子节点不需要该方法,所以将该方法写成一个空实现方法,这样叶子节点继承该类时就不会被迫实现不需要的方法了。
   */
  public void add(OrganizationComponent component) {
    throw new UnsupportedOperationException();
  }
  /**
   * 删除方法
   * 同add()方法一样设计为空实现。
   */
  public void remove(OrganizationComponent component) {
    throw new UnsupportedOperationException();
  }
 ... get()、set()、有参构造方法
}

公司 => 对应Composite角色

public class Company extends OrganizationComponent {
  // components的作用就是,管理公司下的部门,也就是公司下的子节点。
  private List<OrganizationComponent> components = new ArrayList<>();
  ... 有参构造方法
  /**
   * 重写添加方法
   */
  @Override
  public void add(OrganizationComponent component) {
    this.components.add(component);
  }
  /**
   * 重写删除方法
   */
  @Override
  public void remove(OrganizationComponent component) {
    this.components.remove(component);
  }
  /**
   * 实现显示方法
   */
  @Override
  public void show() {
    // 打印公司名称
    System.out.println("======" + "名称:" + this.getName() + " 描述:" + this.getDescribe() + "======");
    // 打印公司下的子节点
    for (OrganizationComponent component : components) {
      component.show();
    }
  }
}

部门 => 对应Composite角色

public class Department extends OrganizationComponent {
  // components的作用就是,管理部门下的员工,也就是部门下的子节点。
  private List<OrganizationComponent> components = new ArrayList<>();
  ... 有参构造方法
  /**
   * 重写添加方法
   */
  @Override
  public void add(OrganizationComponent component) {
    this.components.add(component);
  }
  /**
   * 重写删除方法
   */
  @Override
  public void remove(OrganizationComponent component) {
    this.components.remove(component);
  }
  /**
   * 实现显示方法
   */
  @Override
  public void show() {
    // 打印部门名称
    System.out.println("======" + "名称:" + this.getName() + " 描述:" + this.getDescribe() + "======");
    // 打印部门下的子节点
    for (OrganizationComponent component : components) {
      component.show();
    }
  }
}

员工 => 对应的是Leaf角色

public class Workers extends OrganizationComponent {
  ... 有参构造方法  /**
   * 实现显示方法
   */
  @Override
  public void show() {
    System.out.println("名称:" + this.getName() + " 描述:" + this.getDescribe());
  }}

客户端测试类

public class Client {
  public static void main(String[] args) {    // 公司    OrganizationComponent company = new Company("小菜鸟公司", "从不加加班的公司");
    // 部门    OrganizationComponent department = new Department("研发部", "一个神奇的部门");
    // 公司下添加部门    company.add(department);    // 员工    department.add(new Workers("大牛", "上班摸摸鱼"));
    department.add(new Workers("小菜鸟一号", "天天CRUD"));
    // 输出    company.show();  }}

执行结果

图片:执行结果图

总结

1、使用组合模式可以让用户可以使用统一的方式处理整个树形结构的个别对象和组合对象,从而简化客户端的操作。

2、组合模式具有较强的扩展性,当我们想要更改组合对象时,只需要调整内部的层次关系即可,客户端不需要作出任何改动。

3、客户端不用考虑组合中的细节,通过添加节点和叶子就可以创建出复杂的树形结构。

4、当需要处理的对象是树形结构时可以考虑使用组合模式。

5、节点和叶子节点存在很大差异的情况下不建议使用组合模式。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。



Tags:设计模式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  Tags: 设计模式  点击:(16)  评论:(0)  加入收藏
存在任何解决实际人类问题的业务。它可能是提高速度,降低成本,提高便利性,增加生活乐趣或使知识触手可及。通常用于解决这些业务问题的技术。但是,为什么设计模式很重要?IT系统的典型挑战是可用性,可伸缩性,弹性,数据管理,性能...【详细内容】
2021-01-14  Tags: 设计模式  点击:(176)  评论:(0)  加入收藏
1.单例模式作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例。应用:常用于管理资源,如日志、线程池实现要点:在类中,要构造一个实例,就...【详细内容】
2020-12-01  Tags: 设计模式  点击:(94)  评论:(0)  加入收藏
提到设计模式,很多人都会觉得老生常谈,有些人觉得设计模式很有必要,有些人觉得设计模式没那么重要,那么我们在工作中是否应该重视设计模式呢?我们是否应该将设计模式大量应用到我...【详细内容】
2020-11-10  Tags: 设计模式  点击:(102)  评论:(0)  加入收藏
大家好,欢迎来到设计模式专题,我们的主旨是介绍一些有趣好玩的设计模式。今天我们介绍的设计模式叫做命令模式(command),在这个模式下,我们可以实现do和undo的解耦,让使用方不用...【详细内容】
2020-10-16  Tags: 设计模式  点击:(111)  评论:(0)  加入收藏
什么是微服务模式随着网络基础设施的高速发展,以及越来越多的个体接入互联网,在考虑构建支持海量请求以及多变业务的软件平台时,微服务架构成为多数人的首选。微服务架构的出现...【详细内容】
2020-09-09  Tags: 设计模式  点击:(95)  评论:(0)  加入收藏
什么是组合模式“组合模式”也被称为“部分整体模式”该模式属于结构型模式的一种。讲解该模式之前先带大家熟悉一下“树形结构”。相信大家对“树形结构”不会太陌生,如果你...【详细内容】
2020-09-08  Tags: 设计模式  点击:(119)  评论:(0)  加入收藏
计算机是为了让人们变轻松而承担现实世界中一部分工作的机器,但现实世界与软件之间存在着很大的沟壑,为了填补这个沟壑,我们需要进行3个阶段的工作,即「业务分析」、「需求定义...【详细内容】
2020-08-20  Tags: 设计模式  点击:(111)  评论:(0)  加入收藏
上次有小伙伴建议,源码分析太枯燥了,要是能够结合设计模式一起来,这样更有助于大家理解 Spring Security 源码,同时还能复习一波设计模式。因此松哥今天就试着整一篇,和大家来聊...【详细内容】
2020-07-31  Tags: 设计模式  点击:(47)  评论:(0)  加入收藏
事件驱动架构是一种分布式的异步架构模式,是解耦复杂系统组件的一种处理手段。这种架构模式主要包含两种实施方式,一种是集中式的,一种是非集中式的。集中式架构 其包含了 even...【详细内容】
2020-06-30  Tags: 设计模式  点击:(72)  评论:(0)  加入收藏
▌简易百科推荐
JAVA开发工程师(北京)本科 3-5年经验 面议 (招1人)岗位职责:1.负责我行应用系统的设计,完成软件编码工作,负责管理代码设计规范等工作;2.根据应用需求分析说明书,评估需求研发的可行...【详细内容】
2021-12-27  just do丶IT公众号    Tags:国企   点击:(1)  评论:(0)  加入收藏
今天聊聊编程的本质。程序就是数据结构+控制+逻辑,程序员编程工作的本质是翻译,翻译机要来了,程序员怎么办?黑客帝国中的程序黑客帝国4就要上映了,不知道前三部你看懂了么?值得多...【详细内容】
2021-12-17  博士聊IT    Tags:程序员   点击:(8)  评论:(0)  加入收藏
梦醒之后,每个人对于这份职业的未来、互联网行业的未来,以及更重要的,自己的未来都有了更现实的判断 文 | 祝颖丽编辑 | 黄俊杰一个生于 1986 年的人,他所走过的前半生:从出生起,...【详细内容】
2021-12-03    财经杂志  Tags:程序员   点击:(15)  评论:(0)  加入收藏
前些天在头条看到一个八二年的哥们,述说自己找工作屡次被拒的问题,在网上引起了广泛的讨论,这件事给我留下了很深的印象,因为这哥们和我同是程序员,都人到中年,上有老下有小。唯一...【详细内容】
2021-12-01  云南贤哥在深圳    Tags:程序员   点击:(20)  评论:(0)  加入收藏
很多读者都问过一个问题:程序员如何实现高速成长?之前也写过相关的文章,强调的主要是夯实计算机体系基础知识。 再说另一个诀窍:多看经典开源项目,这些项目大多是众多顶尖程序员...【详细内容】
2021-11-30  findyi    Tags:程序员   点击:(14)  评论:(0)  加入收藏
近日,一位45岁的网民在中国政府网留言求职,引发关注。该网民自称是一名软件开发人员,今年45岁,精通各种技术体系,“而我辞职回家半年后再回来寻找工作机会的时候,却发现连个面试...【详细内容】
2021-11-17  郭主任    Tags:程序员   点击:(42)  评论:(0)  加入收藏
即使在安全技术取得进步之后,网络犯罪仍在不断增加。据统计,网络犯罪每分钟给企业造成约 290 万美元的损失。主要是因为新技术不断涌现,难以维护安全。随着网络威胁的增加,网络...【详细内容】
2021-11-04  章大千    Tags:编程语言   点击:(40)  评论:(0)  加入收藏
北漂小伙李强(化名),在北京互联网大厂工作7年,月薪3万,离职回老家开摄影店,亏了200万。李强出生于山西一座名不经传的小城市,互联网专业大学毕业的他,没有听父母的劝言回到家乡考公...【详细内容】
2021-10-29  霸王课  今日头条  Tags:程序员   点击:(51)  评论:(0)  加入收藏
程序员是青春饭,这在国内似乎是公认的。所以很多公司不愿招大龄程序员,很多程序员也“知趣”地及早转型。有的做管理,有的做架构,我还见过改行卖保险的。总之,年龄大了不想敲代码...【详细内容】
2021-10-27  编程的艺术    Tags:   点击:(29)  评论:(0)  加入收藏
软件工程专业有Web开发、移动终端开发、大数据开发、计算机系统工程师、视频开发工程师、计算机软件应用工程师等就业方向。第一,Web开发。Web开发包括前端开发和后端开发。...【详细内容】
2021-10-19  辰新   企鹅号  Tags:软件工程   点击:(79)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条