组合模式(Composite Pattern )

2015/04/29 00:39
阅读数 281

当我想去了解组合模式的时候,网上搜一下,有很多优秀的文章,但很多人都在直接给出了组合模式的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:如果不太明白组合是什么,可以先了解一下组合与继承

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部