`
zhangweieye
  • 浏览: 8935 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式学习笔记(十五:组合模式)

 
阅读更多

1.1概述

  将对象组合成树形结构以表示“部分-整体”的层次结构。组合(Composite)使用户对单个对象和组合对象的使用具有一致性。这就是组合模式的定义。

  如果一个对象包含另一个对象的引用,称这样的对象为组合对象。如果将当前组合对象作为一个整体的话,那么它所包含的对象就是该整体的一部分。如果一个对象不含有其他对象的引用,称这样的对象为个体对象。在编写程序时,我们希望将许多个体对象和组合对象组成树形结构,以此表示“部分-整体”的层次结构,并借助该层次结构使得用户能用一致的方式处理个体对象和组合对象。在组成的树形结构中,个体对象和组合对象都是树中的节点,但是,组合对象拥有其他节点的对象,个体对象是不具有其他子节点的叶节点。也就是说在树形结构中,组合对象所含有的对象将作为该组合对象的子节点被对待。

    例如,我们常用软件上的菜单栏,分为一级菜单,二级菜单,三级菜单。其中,一级菜单中包含二级菜单,二级菜单中包含三级菜单。具体示意如下图一:

 

图一:菜单栏分级示例 

    组合模式是关于怎样将对象形成树形结构来表现整体和部分的层次结构的成熟模式。使用组合模式,可以让用户以一致的方式处理组合对象和个体对象,组合模式的关键在于无论是个体还是组合对象都实现了相同的接口或都是同一个抽象类的子类。

 

1.2模式的结构

组合模式包含有以下三种角色:

(1)抽象组件(Component):是一个接口(抽象类),该接口(抽象类)定义了个体对象和组合对象需要实现的关于操作其子节点的方法,比如add()remove()以及getChild()等方法。抽象组件也可以定义个体对象和组合对象用于操作其自身的方法,比如isLeaf()

(2)Composite节点(Composite Node):实现Component接口(或者抽象类)类的实例,Composite节点不仅实现Component接口,而且可以含有其他Composite节点或Leaf节点的引用。

(3)Leaf节点(Leaf Node):实现Component接口(或抽象类)类的实例,Leaf节点实现Component接口,不可以含有其他Composite节点或Leaf节点的引用,因此,叶节点在实现Component接口有关操作子节点的方法时,比如add()remove()getChild()方法,可让方法抛出一个异常,也可以实现为空操作。

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

 

 

图二:组合模式的类图

 

1.3组合模式的优点

1)组合模式中包含个体对象和组合对象,并形成树形结构,使用户可以方便地处理个体对象和组合对象。

2)组合对象和个体对象实现了相同的接口,用户一般无须区分个体对象和组合对象。

3)当增加新的Composite节点和Leaf节点时,用户的重要代码不需要做出修改。

 

1.4适合使用组合模式的情景

1)当想表示对象的部分-整体层次结构。

2)希望用户用一致的方式处理个体对象和组合对象。

分享到:
评论

相关推荐

    尚硅谷设计模式源码笔记课件.zip

    结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、...

    《C++20设计模式》学习笔记-第8章组合模式-配套学习代码

    《C++20设计模式》学习笔记-第8章组合模式-配套学习代码

    《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解

    本文实例讲述了Javascript面向对象程序设计组合模式。...其实从面向对象之五之后,与javascript本身关系不是很大,更重要的是设计模式的一些概念,只要了解javascript面向对象的一般知识,掌握设计模式的含义,代码

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    2. 结构型模式:结构型模式关注对象之间的组合关系,包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。这些模式可以帮助我们更好地组织和管理对象之间的关系,提高代码的灵活性和可...

    Head First 设计模式学习笔记(十四)模式的组合使用

    NULL 博文链接:https://chxiaowu.iteye.com/blog/1276845

    java-design-patterns:Java 设计模式学习笔记

    Java Design PatternsJava 设计模式学习笔记,简单易懂,每个模式都有相应的代码示列,帮助学习理解。在线阅读地址:设计原则创建型模式作用:将创建与使用代码解耦结构型模式作用:将不同的功能代码解耦桥接模式...

    关于自己学习设计模式的笔记整理

    该文档是自己在学习设计模式时整理的常用设计模式pdf文档,包括源码,包括装饰模式,代理模式,责任链模式,命令模式,解释器模式,迭代器模式,备忘录模式,观察者模式,工厂模式,建造者模式,适配器模式,桥梁...

    软件设计模式经典案例讲解

    针对几种经典软件设计模式:模板方法模式 外观模式 代理模式 装饰器模式 桥模式 工厂方法模式 组合模式等给出了简单易懂的讲解,透彻明了。很好的学习资料哦,是我平时学习时做的笔记外加自己的理解,很不错的……

    《javascript设计模式》学习笔记二:Javascript面向对象程序设计继承用法分析

    本文实例讲述了Javascript面向对象程序设计继承用法。分享给大家供大家参考,具体如下: 1.关于继承: 百度百科对继承的解释是:继承是指一个对象直接使用另一对象的属性和方法。 (话说百科对于计算机概念的继承的...

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    describe:设计模式学习笔记 逻辑结构图 代码结构图 设计模式简述 创建型模式,共五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式,共七种:适配器模式,装饰器模式,代理模式,...

    javascript设计模式之策略模式学习笔记

    策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句。  2. 策略模式提供了开放-封闭原则,使代码更容易理解和扩展。  3. 策略模式中的代码可以复用。 一:使用策略模式计算奖金; 下面的demo是我在书...

    左程云leetcode-hjLearningNotes:hj学习笔记

    第一部分:设计模式 & UML 简单工厂 工厂方法模式 抽象工厂模式 策略模式 责任链模式 命令模式 模板方法模式 适配器模式 代理模式 外观模式 组合模式 装饰模式 享元模式 桥接模式 Builder模式 状态模式 解释器模式 ...

    leetcode下载-LearningNotes:学习笔记

    组合模式 装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五部分 ##第六部分 有任何...

    leetcode下载-LearnNote:学习笔记

    组合模式 装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六部分 有任何问题欢迎联系...

    java-design-patterns:java 学习模式

    Java Design Patterns 学习笔记 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    leetcode下载-AndroidLearningNotes:Android学习笔记

    组合模式 装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六部分 有任何问题欢迎联系...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    java8源码-akangaroo:学习笔记,完善中

    学习笔记较长,如果想查看文章的目录,chrome浏览器可以配合简悦插件使用,或者下载到本地使用Typora打开。 :hot_beverage: Java基础 Java容器 Java并发 数据结构和算法 数据结构 树 图 算法 分治 动态规划 回溯 ...

Global site tag (gtag.js) - Google Analytics