首页 > 编程语言 >Java设计模式 —— 组合模式

Java设计模式 —— 组合模式

时间:2022-10-09 20:26:01浏览次数:57  
标签:容器 Java 组合 Component 叶子 构件 设计模式 public

9 组合模式

9.1 组合模式概述

Composite Pattern: 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式使得客户端可以统一处理单个对象和组合对象

组合模式关注那些包含叶子构件和容器构件的结构以及它们的组织形式,在叶子构件中不包含成员对象,而容器构建中可以包含成员对象,这些对象通过递归组合构成一个树形结构。组合模式为叶子构件和容器构件提供一个公共的抽象类,客户端可以针对抽象类编程,而无须关心操作的是叶子构件还是容器构件。

组合模式结构图如下所示:

需要注意的是虽然这个设计模式叫做组合模式,但容器构件和抽象构件之间是聚合关系,不要混淆啦。

9.2 组合模式实现

9.2.1 抽象构件类

它可以是接口或抽象类,为叶子构件和容器构件对象声明方法。

public abstract class Component {
  public abstract void operation();
  public void add(Component c) {
    // 默认实现,抛出异常
  }
  public remove(Component c) {
    // 默认实现,抛出异常
  }
  public Component getChild(int i) {
    // 默认实现,抛出异常
    return null;
  }
}

9.2.2 叶子构件类

叶子构件没有子构件,它只实现了抽象构件中的 operation() 方法。

public class Leaf extends Component {
  public void operation() {
    // 叶子构件业务逻辑实现
  }
}

9.2.3 容器构件类

容器构件包含子构件,其子构件可以是容器或叶子构件,它提供一个集合用于存储子构件。

public class Container extends Component {
  private List<Component> list = new ArrayList<Component>();
  
  public void add(Component c) {
    list.add(c);
  }
  
  public void remove(Component c) {
    list.remove(c);
  }
  
  public Component getChild(int i) {
    return (Component)list.get(i);
  }
  
  public void operation() {
    // 容器构件业务逻辑,递归执行,调用其中叶子节点的 operation 方法
    for (Component c : list) {
      c.operation();
    }
  }
}

9.3 透明组合模式

上述例子就是一个透明组合模式,叶子对象和容器对象所提供的方法是一致的,客户端可以完全同等的对待所有的对象。

但这种方式的缺点就是不够安全,因为叶子节点和容器节点是有本质上的区别的。叶子对象不会有子结构,不会包含成员对象,因此为其提供 add() 等方法是无意义的。

9.4 安全组合模式

安全组合模式结构图如下所示:

与透明组合模式相比,抽象构件 Component 中不再声明用于管理成员对象的方法,而是在容器构件 Container 中声明并实现。

安全组合模式的缺点就是不够透明,客户端无法同等对待叶子构件和容器构件。容器构件中那些管理成员对象的方法没有在抽象构件类定义,无法完全针对抽象类编程,必须区别的对待叶子构件和容器构件。

9.5 组合模式优/缺点

组合模式的应用例子:界面控件GUI

组合模式的优点主要如下:

  • 新增容器构件和叶子构件都无须修改原有代码,符合开闭原则
  • 客户端可以一致的使用容器构件和叶子构件,无须关系处理的单个对象还是容器对象,简化客户端代码
  • 为树形结构的问题提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合可以形成复杂的树形结构,但对树形结构的操作却非常简单

组合模式的缺点主要如下:

  • 很难对容器中的构件类型进行限制,因为所有的叶子构件都来自相同的抽象层,只能通过运行时进行类型检查来实现,这个过程较为复杂

标签:容器,Java,组合,Component,叶子,构件,设计模式,public
From: https://www.cnblogs.com/ylyzty/p/16773505.html

相关文章

  • Java基础001:数据类型及扩展
    Java的数据类型分为两大类基本类型(primitivetype)数值类型整数类型byte占1个字节范围:-128-127short占2个字节范围:-32768-32767int占4个字节范围:-2147483648-......
  • java---类充当属性
    packagecom.javasm.obj;publicclassStudentInfo{ publicintid; publicStringname; publicStringgender; //Computer类充当学生属性 //能够......
  • 3 设计模式-建造者模式
    建造者模式在现实生活中如果我们需要制造一个比较复杂的东西,比如手机,台式电脑,或者汽车等。如果我们要制造一台电脑的话我们会先将电脑所需的各个部件买回来然后在组装起......
  • java后台开发最常用的开发 中文文档在线版
     自己用到的中文文档:这里做个汇总,方便自己查看。spring:​​https://lfvepclr.gitbooks.io/spring-framework-5-doc-cn/content/​​springMVC:​​https://www.w3cschool.c......
  • JAVA字段的初始化规律
    1.类的构造方法(1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。(2)如果类没有定义构造函数,Java编译器在......
  • 用一份JAVA工程师的求职简历来说说求职简历怎么写
    这是一篇我比较想看到的简历指导的文章。但是我比较反对简历造假。我觉得会什么写什么把。可以先看看我的这篇文章:刚实习结束,就要做面试官,谈谈我的想法自己做过面试官以后,自......
  • Java基本语法 for循环
    for循环虽然所有循环结构都可以用while或者do...while表示,但Java提供了另一种语句——for循环,使一些循环结构变得更加简单。for循环执行的次数是在执行前就确定......
  • 【Java高级】程序、进程和线程
    1.程序一段静态的代码(未启动的APP),可以完成特定任务。2.进程正在运行的程序(挂在后台的APP),系统给进程分配了内存。3.线程程序内部的一条执行路径(比如QQ中执行聊天功能,发......
  • 基于SSM+Vue校园勤工助学网站Java大学生勤工俭学管理系统(源码调试+讲解+文档)
    ......
  • 【Java高级】并行与并发
    1.单核与多核CPU(1)单核:一个人(2)多核:多个人人与人之间有力量的大小区分,核心也可分为大核、小核。多个人一起搬砖需要指挥配合->对多核的优化。2.串行排队一个一个来......