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