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