文档章节

组合模式(Composite Pattern )

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:39
字数 931
阅读 16
收藏 1

当我想去了解组合模式的时候,网上搜一下,有很多优秀的文章,但很多人都在直接给出了组合模式的UML图,然后就去讲解什么是组合,组合有什么优缺点。

我承认他们也许讲的很好,但我并没有一下子就能理解了组合模式,也不了解文章所说的优缺点;结合自己的感受,所以在这里,我想

把书上看到的UML类图变化,和大家分享一下,看看组合模式是怎么一步一步演变出来的。这样,以后开发就知道自己在做哪一步了,

该怎么去调整自己的项目结构。

 

案例:公司的人事管理,就是领导与被领导。。。

 

 

根据这个人事图,最先设计的UML图是:

 

呵呵,如果让你来看这个UML图,你会吐槽点什么呢?有没有发现,接口里有好多方法重复了呢?有没有觉得这样的设计很烂。。。。

所以,改进是必须的:

 

 

 改进版的UML看起来很不错额,最起码干掉了一个IRoot接口,你看多牛逼,整个类图看起来简洁很多而且方法也不重复

了,很有成就感是不是,但仔细看看,真的改好了吗?仔细look。。。

 

现在我们能理解了吧,上一个类图中 ILeaf接口中的getInfo()方法有重大的嫌疑,你再回去仔细瞧瞧;

那现在这个类图行了吗?   这个时候我们的理解一下接口的作用了,

接口的作用:定义共性,凡是其他接口有的,另一个接口就没必要重复了。

所以,你还得仔细想想,有没有哪些是功能上重复了的。。。。。

 

 

对的,上一图中ICop中getInfo()是不是和IBranch中的getSubordinateInfo()功能上重复了,所以还得改,最终才有这个版本的类图。

也许你已经发现,怎么和文章中的第一个图那么相似呢?

对的,这个就是组合模式图了,也就是说,如果你把自己的项目优化优化,也许不知不觉中就在使用了组合模式。

 

好吧,现在理解了什么是组合模式没?没的话,就多看几遍类图吧,代码就不上了,网上一搜还是有很多的,其实,我也没怎么看代码,只是看了好几遍这几个UML图,自己去慢慢品味的。。。。

 

好吧,我也留下笔记好了,说说官方的组合模式:

 

组合模式的几个角色:

抽象构件(Component):定义参加组合的对象的共有方法和属性,可以定义一些默认的行为或属性,比如getInfo

叶子构件(Leaf):叶子对象,其下没有分支。

树枝构件(Composit):树枝对象,它的作用是组合树枝节点和叶子节点。

 

组合的适用场合:

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

2. 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

 

优点:

1. 组合模式可以很容易的增加新的构件。

2. 使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。

缺点:

1. 使用组合模式后,控制树枝构件的类型不太容易。

2. 用继承的方法来增加新的行为很困难。

 

 

 

 

PS:如果不太明白组合是什么,可以先了解一下组合与继承

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/8455139

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Design Pattern - Composite

按照每天一个设计模式的节奏,今天进入Composite模式,这个模式在软件开发中还是很容易出现的,尤其界面控件,比如listview是由list和header两个控件组合而成. 当然了,逻辑领域例子也不少, 正如1...

woodo
2014/04/21
26
0
【设计模式】组合模式 Composite Pattern

树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承关系,部门的组...

风之源
2018/08/20
0
0
设计模式学习笔记十七:组合模式(Composite Pattern)

1.概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部...

长平狐
2013/06/17
92
0
中国科技大学网络视频课程软件设计模式(自主模式)

中国科技大学网络视频课程软件设计模式(自主模式) 课程简介 本课程为中国科学技术大学软件学院软件工程专业选修课,学分为3;预修课程有《软件工程》/《UML建模语言》/《Java编程语言》/《...

dragonscroll
2018/01/12
0
0
乐在其中设计模式(C#) - 组合模式(Composite Pattern)

[源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:webabcd 介绍 将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性...

技术小胖子
2017/11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
4
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部