Java设计模式:组合模式

目录
  • 概述
  • 结构
  • 组合模式案例
    • 分析
  • 总结

在本讲,我们来学习一下结构型模式里面的第六个设计模式,即组合模式。

概述

在学习组合模式之前,我们先来看下面这张图。

对于以上这张图大家应该很熟悉,我们可以将其看作是一个文件系统,其实说到底它就是Windows系统里面的一个目录结构,只不过对于Windows中的文件系统而言,它里面包含有C盘、D盘、E盘等等盘符,而这里我们只是以它里面的某一个盘符里面的目录结构为例来进行了一个描述。

对于这样的结构我们称之为树形结构。为啥叫树形结构呢?你看一下上图中的左边部分,最上面是不是有一个WINDOWS目录啊,而该WINDOWS目录下面又有很多的子目录或者子文件,这样,我们就能将其描述成上图右边部分的树形结构了,它是不是很像一棵倒着的树啊!既然是一棵树,那么它就只有一个树根了,很明显,这个树根就是最顶层的WINDOWS目录,在该目录下,自然就会生成许多的子文件或者子文件夹了,而如果要是子文件夹的话,那么它下面又可以有许多的子文件或者子文件夹了,以此类推,一棵参天大树就长成了。

对于这样一个文件系统而言,有几个概念大家需要知道一下,文件夹或者文件我们都可称之为节点,但是一般来说,我们称文件为叶子节点,称文件夹为树枝节点,这是因为树枝还可以再去生成子树枝或者子叶子。

在这样一个树形结构中,我们可以通过调用某个方法来遍历整棵树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作了。因此,我们不妨将这颗树理解成一个大的容器,容器里面包含有很多的成员对象(其实就是节点对象),这些成员对象既可以是容器对象(即文件夹,当然你也可以把它称作是树枝对象)也可以是叶子对象(即文件)。但是由于容器对象和叶子对象在功能上面有所区别(区别是很明显的,叶子对象,即文件,可以读写数据,但是它下面不可能再有子文件或者子文件夹了;而容器对象,即文件夹,它下面是可以再有子文件或者子文件的,但是它不能进行数据的一个读写操作),使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样一来就会给客户带来不必要的麻烦,对于客户来说的话,他始终是希望能够一致的对待容器对象和叶子对象。也就是说,对于客户而言,不管是文件夹还是文件,他都希望一致的去对待它们,即把它们都当作同样的一个对象来进行处理。

至此,我们就认识了一下以上树形结构,并且咱们还知道了该树形结构所存在的一个问题。那如何解决该问题呢?很明显,就要用到组合模式了,因为本文讲的就是组合模式嘛!

那什么是组合模式呢?下面我们来看看它的概念。

组合模式又名部分整体模式(啥又叫部分整体模式呢?上面不是说过嘛,我们可以将一棵树理解成一个大的容器,对于该容器而言,它就是整体;然后它下面不是又有子文件或者子文件夹嘛,这些子文件或者子文件夹我们就称之为部分,当然,部分下面是不是还可以再分出部分来啊!),是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次,这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

看完以上组合模式的概念之后,相信大家就能知道应该要使用组合模式来解决以上树形结构所存在的问题了,因为对于客户而言,他就能一致的去对待容器对象和叶子对象了,这样,他使用起来也会变得更加简单。

结构

组合模式主要包含有三种角色:

  • 抽象根节点(Component):定义系统各层次对象具有的共有方法和属性,可以预先定义一些默认行为和属性。

怎么来理解抽象根节点呢?还是通过上图来理解,不管是文件夹还是文件,我们都可以向上抽取,抽取出一个抽象类,而在这个抽象类里面,我们就可以去定义文件和文件夹中的共有行为和属性了。也就是说,正是因为客户他想要一致的去对待容器对象和叶子对象,所以他就可以定义出这么一个公共的抽象类了

  • 树枝节点(Composite):定义树枝节点的行为,即存储子节点,组合树枝节点和叶子节点形成一个树形结构。
  • 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最小单位。

组合模式案例

接下来,我们就通过一个案例再来理解一下组合模式,这个案例就是软件菜单。

分析

先来看一下下面这张图。

相信大家还是比较熟悉以上这张图的,因为我们在访问别的一些管理系统时,经常可以看到类似的菜单。一个菜单可以包含菜单项(菜单项是指不再包含其他内容的菜单条目),也可以包含带有其他菜单项的菜单,就拿以上系统管理菜单来说,它下面有三个子菜单,分别是菜单管理、权限配置、角色管理,它们都是属于菜单,因为它们下面还可以有子菜单或者子菜单项。对于菜单管理来说,它下面有五个子菜单项,分别是页面访问、展开菜单、编辑菜单、删除菜单、新增菜单,注意了,它们都是菜单项,下面不可能再有子菜单或者子菜单项了,故它们都是属于叶子节点;而系统管理、菜单管理、权限配置、角色管理,它们均属于树枝节点,并且系统管理从根本上来说,它是属于根节点。因此,使用组合模式来描述以上菜单就很恰当了。

这样,我们的需求就是针对一个菜单,例如系统管理,打印出其包含的所有菜单以及菜单项的名称。

需求明确之后,接下来我们就要编写代码解决该需求了。首先,对于该需求,我们先设计出一个如下的类图。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java设计模式之java组合模式详解

    目录 引言 组合模式介绍 角色 模式结构 示例代码 水果盘 文件浏览 更复杂的组合模式 透明与安全 透明组合模式 安全组合模式 组合模式总结 优点 缺点 适用场景 应用 XML文档解析 文件 HashMap Mybatis SqlNode中的组合模式 参考文章 总结 引言 树形结构不论在生活中或者是开发中都是一种非常常见的结构,一个容器对象(如文件夹)下可以存放多种不同的叶子对象或者容器对象,容器对象与叶子对象之间属性差别可能非常大. 由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中

  • 23种设计模式(10)java组合模式

    23种设计模式第四篇:java组合模式 介绍 组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解藕. 组合模式可以优化处理递归或分级数据结构.有许多关于分级数据结构的例子,使得组合模式非常有用武之地. 类图 组成部分: Component: 为参加组合的对象声明一个公共接口, 不管是组合还是叶结点. Leaf: 在组合中表示叶子结点对象,叶子结点没有子结点. Composit

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

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

  • java设计模式-组合模式详解

    目录 组合模式 Demo 代码: 总结 组合模式 组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口. 何时使用:

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

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

  • 快速理解Java设计模式中的组合模式

    组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系. 个人理解:组合模式就是将部分组装成整体. 定义如下: 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通用类图如下: 组合模式的包含角色: ● Component 抽象构件角色 定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. ● Leaf 叶子构件 叶子对象,其下再也没有其他的分支,也就是遍历的最

  • Java设计模式:组合模式

    目录 概述 结构 组合模式案例 分析 总结 在本讲,我们来学习一下结构型模式里面的第六个设计模式,即组合模式. 概述 在学习组合模式之前,我们先来看下面这张图. 对于以上这张图大家应该很熟悉,我们可以将其看作是一个文件系统,其实说到底它就是Windows系统里面的一个目录结构,只不过对于Windows中的文件系统而言,它里面包含有C盘.D盘.E盘等等盘符,而这里我们只是以它里面的某一个盘符里面的目录结构为例来进行了一个描述. 对于这样的结构我们称之为树形结构.为啥叫树形结构呢?你看一下上图中的左

  • javascript设计模式 – 组合模式原理与应用实例分析

    本文实例讲述了javascript设计模式 – 组合模式原理与应用.分享给大家供大家参考,具体如下: 介绍:组合模式又叫部分整体模式,用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次 定义:组合多个对象形成树形结构以表示具有整体一部分关系的层次机构.组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以成为整体一部分模式. 它是一种对象结构型模式. 场景:我们对公司的人员架构进行一下打印,假设所有管理岗和开发岗的区

  • java设计模式策略模式图文示例详解

    目录 策略模式 意图 问题 解决方案 真实世界类比 策略模式结构 伪代码 策略模式适合应用场景 实现方式 策略模式优缺点 策略模式优缺点 与其他模式的关系 策略模式 亦称:Strategy 意图 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换. 问题 一天,你打算为游客们创建一款导游程序.该程序的核心功能是提供美观的地图,以帮助用户在任何城市中快速定位. 用户期待的程序新功能是自动路线规划:他们希望输入地址后就能在地图上看到前往目的

  • java设计模式-代理模式(实例讲解)

    代理模式是java最常见的设计模式之一.spring的aop就是使用了代理模式. 一般而言,代理模式分为静态代理和动态代理两种. 作为结构类的设计模式,作用在于不修改类内部代码的情况下,对类进行拓展,是对继承机制的一种补充. eg :下面就用户登录这个例子实现一下代理模式. 基本需求是:实现用户的登录和修改昵称功能. 上代码,先是IUser接口和user实现类 public interface IUser { //登录 void login(String userId,String passwo

  • 详解Java设计模式——迭代器模式

    迭代子模式 顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松.这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问.我们看下关系图: 这个思路和我们常用的一模一样,MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例,我们来看看实现代码: 两个接口: public interface Collection { pub

  • 详解Java设计模式——命令模式

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的.我们看看关系图: Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象,看实现代码: public interface Com

  • Java使用组合模式实现表示公司组织结构功能示例

    本文实例讲述了Java使用组合模式实现表示公司组织结构功能.分享给大家供大家参考,具体如下: 一.模式定义 组合模式:将对象组合成树形结构以表示"部分一整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.组合模式举例 1 模式分析 我们借用公司组织结构图来说明这一模式. 经过分析后,我们得出该模式静态类图如下: 2 代码示例 2.1 建立员工抽象类 package com.demo.composite; /** * 职工类接口 * * @author * */

  • Java设计模式模板方法模式(Template)用法解析

    这篇文章主要介绍了Java设计模式模板方法模式(Template)用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象"来做调整",针对这种拥有固定算法流程,其中有固定的步凑,存在不固定的步凑的情况下就诞生了模板方法模式. 模板方法模式(Template)定义

  • java设计模式:建造者模式之生产线

    目录 什么是建造者模式 建造者模式中的角色 产品角色(Product) 抽象建造者(Builder) 具体建造者角色(ConcreteBuilder) 导演者角色(Director) 最终测试 总结 什么是建造者模式 建造者模式( Builder Pattern )是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 实用范围: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时.当构造过程必须允许被构造的对象有不同表示时. 设计模式和编程

随机推荐