java设计模式之组合模式(Composite)

概述

是一种结构型模式,将对象以树形结构组织起来,以表示“部分 - 整体”的层次结构,使得客户端对单个对象和组合对象的使用具有唯一性。

UML类图

上面的类图包含的角色:

Component:为参加组合的对象声明一个公共的接口,不管是组合还是叶节点。
Leaf:在组合中表示叶子结点对象,叶子结点没有子结点。
Composite:表示参加组合的有子对象的对象,并给出树枝构建的行为;

代码示例

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

abstract class Component {

  protected String name;

  public Component(String name) {
    this.name = name;
  }

  public abstract void Add(Component c);

  public abstract void Remove(Component c);

  public abstract void GetChild(int depth);
}

class Leaf extends Component {

  public Leaf(String name) {
    super(name);
  }

  @Override
  public void Add(Component c) {
    System.out.println("Can not add to a leaf");
  }

  @Override
  public void Remove(Component c) {
    System.out.println("Can not remove from a leaf");
  }

  @Override
  public void GetChild(int depth) {
    String temp = " ";
    for (int i = 0; i < depth; i++) {
      temp += "-";
      System.out.println(temp + name);
    }
  }

}

class Composite extends Component {

  private List<Component> children = new ArrayList<>();

  public Composite(String name) {
    super(name);
  }

  @Override
  public void Add(Component c) {
    children.add(c);
  }

  @Override
  public void Remove(Component c) {
    children.remove(c);
  }

  @Override
  public void GetChild(int depth) {

    for (Component c : children) {
      c.GetChild(depth);
    }
  }

}

public class Main {

  public static void main(String args[]) {
    Composite root = new Composite("root");
    root.Add(new Leaf("Leaf A"));
    root.Add(new Leaf("Leaf B"));

    Composite compX = new Composite("Composite X");
    compX.Add(new Leaf("Leaf XA"));
    compX.Add(new Leaf("Leaf XB"));
    root.Add(compX);

    Composite compXY = new Composite("Composite XY");
    compXY.Add(new Leaf("Leaf XYA"));
    compXY.Add(new Leaf("Leaf XYB"));
    compX.Add(compXY);

    root.GetChild(3);
  }

}

应用场景

1.要求表示对象的部分-整体层次结构。
2.想要客户端忽略组合对象与单个对象的差异,客户端将统一地使用组合结构中的所有对象。

组合模式定义由Leaf对象和Composite对象组成的类结构;
使得客户端变得简单;
它使得添加或删除子部件变得很容易。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java 中组合模型之对象结构模式的详解

    Java 中组合模型之对象结构模式的详解 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 你想表示对象的部分-整体层次结构 你希望用户忽略组合对象与单个对象的不同,用户将统一使用组合结构中的所有对象. 三.结构 四.代码 public abstract class Component { protected String name; //节点名 public Component(String n

  • 关于Java中的继承和组合的一个错误使用的例子

    相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎大家留言指正. 什么是「组合」和「继承」 假设有2个class:A和B: 如果class A extends B 那么我们就说A继承B,A是子类,B是父类,这种情况就是继承. 如果A中有一个属性的类型为B,那么我们就说这种情况就是组合. 分别在什么情况下使用 回想一些我们一般会在什么情况下考虑这两个东西呢?我大致想了一下,往往会有如下的场景:

  • JAVA设计模式之组合模式原理与用法详解

    本文实例讲述了JAVA设计模式之组合模式.分享给大家供大家参考,具体如下: 组合(整体与部分关系)模式:将不同但是相关的对象组合成树形结构以实现"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. * 模式角色组成: 1.Component对象: 是组合中的对象接口,是所有类共有的接口.是用于统一定义整体中的部分. 2.Leaf对象: 整体中的部分,没有下一级. 3.Composite对象: 用来存储子部件,在Component接口中实现与部分有关操作. 以公司构成

  • Java中Lambda表达式并行与组合行为

    从串行到并行 串行指一个步骤一个步骤地处理,也就是通常情况下,代码一行一行地执行. 如果将我们常用的迭代器式的循环展开的话,就是串行执行了循环体内所定义的操作: sum += arr.get(0); sum += arr.get(1); sum += arr.get(2); //... 在书的一开始,就提到Java需要支持集合的并行计算(而Lambda为这个需求提供了可能). 这些功能将全部被实现于库代码中,对于我们使用者,实现并行的复杂性被大大降低(最低程度上只需要调用相关方法). 另外,关于

  • Java依赖-关联-聚合-组合之间区别_动力节点Java学院整理

    首先看一看书上对这四种关系的定义: 依赖(Dependency)关系是类与类之间的联接.依赖关系表示一个类依赖于另一个类的定义.例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House.与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的.一般而言,依赖关系在Java语言中体现为局域变量.方法的形参,或者对静态方

  • java设计模式之组合模式(Composite)

    概述 是一种结构型模式,将对象以树形结构组织起来,以表示"部分 - 整体"的层次结构,使得客户端对单个对象和组合对象的使用具有唯一性. UML类图 上面的类图包含的角色: Component:为参加组合的对象声明一个公共的接口,不管是组合还是叶节点. Leaf:在组合中表示叶子结点对象,叶子结点没有子结点. Composite:表示参加组合的有子对象的对象,并给出树枝构建的行为: 代码示例 import java.util.ArrayList; import java.util.Lis

  • 分析Java设计模式之组合模式

    目录 一.概述 二. 模式定义 三. 模式结构 四. 模式实现 五. 模式优缺点 5.1.优点 5.2.缺点 六. 模式适用场景 七. 模式总结 一.概述 我们对于这个图片肯定会非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构.在数据结构中我们了解到可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作.我们可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象.但是由于容器对象

  • Java设计模式之组合模式的示例详解

    目录 定义 原理类图 案例 需求 方案 分析 总结 定义 组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性 原理类图 Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口 leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构 Composite

  • Java设计模式之组合模式深入刨析

    目录 1.基本介绍 2.结构 3.组合模式解决的问题 4.组合模式解决学校院系展示 5.组合模式的注意事项和细节 1.基本介绍 1)组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系 2)组合模式依据树形结构来组合对象,用来表示部分以及整体层次 3)这种类型的设计模式属于结构型模式 4)组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象 2.结构 组

  • C++设计模式之组合模式(Composite)

    组合模式为了描述分支包含关系,也就是我们说的树形关系,其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点.我们对枝和叶进行行为抽象,可认为枝和叶都是Component,而叶是最小的操作单元,其下不存在枝和叶,而枝作为Composite里面存有其下枝和叶的组件列表. 作用 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性 类视图 实现 #include <iostream> #include <list> #in

  • Java设计模式之组合模式

    本文通过老王和小王探讨书房.书架.各类书的管理问题,引出结构型设计模式家族中的一个重要成员——组合模式,本文会给予两种组合模式的典型代码实现,为了加深理解会在第三部分应用中介绍组合模式在源码中的实际运用,最后总结该设计模式学习后的一些思考. 读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到码云,本地源码下载. 一.引出问题 上篇文章中老王给小王买车以后,小王对老王感激涕零,看着老王凌乱的书房,小王提出要帮助老王整理整理他的书架. 小王开始了他的分析.老王平时博览群书,中文.英文.梵

  • 深入理解Java设计模式之组合模式

    目录 一.什么是组合模式 动机(Motivation) 意图(Intent) 二.组合模式的结构 结构图说明: 三.组合模式的使用场景 四.组合模式的优缺点 五.组合模式的实现 六.组合模式的.NET下应用 一.什么是组合模式 定义:将对象以树形结构组织起来,以达成"部分-整体"的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 动机(Motivation) 客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带

  • Java设计模式之组合模式(Composite模式)介绍

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树形结构图.组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行.可以用牵一动百来形容. 所以Composite模式使用到Iterator模式,和Chain of Responsi

  • PHP设计模式(七)组合模式Composite实例详解【结构型】

    本文实例讲述了PHP设计模式:组合模式Composite.分享给大家供大家参考,具体如下: 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更

随机推荐