组合模式前面虽然已经学过了,可是那天给米老师讲这个模式发现自己理解的还是不够透彻,所以今天就再分析分析这个模式。
组合模式是通过把对象组合成树形结构来表示“部分与整体”的层次结构,它使得用户对单个对象和组合对象的使用具有一致性。从这句话上来看,组合模式应该是事先把对象组合成树形结构,包括树枝节点和树叶节点。然后在对树枝节点和树叶节点进行统一的处理,使得用户对树枝节点和树叶节点的使用具有一致性。
在什么时候可以使用组合模式呢?当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就可以使用组合模式了。也就是说首先对象的结构模式应该是树形结构,具有明确的树枝和树叶节点,而且从主观上可以忽略树枝和树叶的不同,可以统一的使用树枝和树叶,这个时候就应该使用组合模式。
还是用书上的例子说明:
实例中北京总公司、上海华东分公司、南京办事处、杭州办事处都是树枝节点;总公司人力资源部、总公司财务部、华东分公司人力资源部、华东分公司财务部、南京办事处人力资源部、南京办事处财务部、杭州办事处人力资源部、杭州办事处财务部都是树叶节点。其中总公司人力资源部与杭州办事处人力资源部都属于树叶节点,不同的是他们属于不同的树枝。总公司人力资源部属于总公司枝干,杭州办事处人力资源部属于杭州办事处枝干。但是它们都可以履行员工招聘培训管理的职责,这就是统一的使用组合结构中的所有对象。
但是我们假设没有各个树枝节点下没有人力部和财务部,那么杭州办事处和南京办事处就成为树叶节点。现在我们想要通过组合模式统一的为各个节点添加人力部和财务部是够可行?从理论上是不可行的,在叶节点中虽然也有Add和Remove,但是这只是为了达到叶节点和枝节点的一致性,叶节点本身不具备Add()、Remove方法。所以杭州办事处和南京办事处下面是不能在添加节点的,但是实际中有没有办法让各个公司和办事处一致的添加人力部和财务部呢?答案是肯定可以!但可能不是使用组合模式,人外有人天外有天,办法总是有的,只是自己现有水平可能还没办法解决,希望高手们指点!感谢!