1.定义
组合模式是一种结构型模型,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
上回说到刘备被设计入赘江东后,通过诸葛孔明的锦囊妙计成功化险为夷。回到荆州后刘备一心想匡扶汉室,于是准备继续招兵买马。水镜先生曾言:“卧龙凤雏,得一便可安天下”。如今卧龙已尽收囊中,可谁曾想这凤雏竟是这庞统,庞士元。
随着时间的推移,刘备兵马粮饷随指数级增长,谁让这厮是出了名的仁义之君呢。现在兵马增多后刘备有了新的烦恼,那就是怎么管理呢?这几万人总不可能自己全都能看住吧。这时候刘备想到了韩信的话,只需要管理管理者就行了。就此开始了刘备公司的组织结构。刘备公司的组织结构如下所示。
CEO-刘备
谋士部门-诸葛孔明
谋士部门-庞统
武将部门-关羽
武将部门-张飞
武将部门-赵云
如此一来我刘备只需要管理部门负责人即可,其余的就交给部门负责人去管理。如此看来这种层次结构不就是我们说的组合模式要实现的内容吗?
相似的对象当成单一对象,部门和人员都具备组织树的特性即部门下可能是人员也有可能存在子部门信息。同时都具备基础信息,比如名字等。
2.组合模式结构图
OrganizationalStructure抽象类表示组织结构,他的子类包含了Department部门类以及Person人员类,部门中和人员中都有名字属性,同时部门有一个List用于存放子部门以及部门下人员信息,子部门和人员信息。
2.组合模式实现
OrganizationalStructure抽象类表示组织结构,其中由于部门和人员信息都属于组织结构具有相似,所以部门和人员信息都是他的子类。printList方法拥有两个方法他们是重载关系,一个用于根据空串为前缀打印另一个根据指定前缀打印。OrganizationalStructure扮演Compent角色,用于将部门和人员进行整合,变成相似物。
Department是部门类,其中部门可以包含部门信息以及部门中的人员或下级部门扮演Composite(复合物角色),同时提供了获取部门名称的方法、在部门中增加人员信息以及下级部门信息、根据指定前缀打印部门信息以及部门下级部门和人员信息。
Person是人员信息类,继承了组织结构抽象类,同时定义了人员信息属性字段。Person扮演的是Leaf(树叶角色),是不可再拆分,所以是树叶,他不能包含子部门。
接下来进行测试,我们要让刘备的组织结构变成如下所示。
/谋士部
/谋士部/诸葛亮
/谋士部/庞统
/武将部
/武将部/张飞
/武将部/赵云
/武将部/黄忠
/武将部/马超
/武将部/关羽
/武将部/弓箭部
/武将部/弓箭部/小兵1
/武将部/弓箭部/小兵2
实际输出结果如下图2,组合模式实际上很适合用于做树结构的层级构建,例如文件和文件夹,菜单和子菜单,部门组织结构等。
参考文献《图解设计模式》
代码获取地址:https://gitee.com/bughong/design-pattern