<设计模式12>组合模式

来源:互联网 发布:龙王传说实体书淘宝 编辑:程序博客网 时间:2024/04/29 20:40

组合模式其实是一个很形象的模式。它也被称为部分整体模式。

组合模式的结构就如同树状图一样。而树就是枝干、叶子的组合,组合模式可以形象的这么理解。

其实文件夹是一个很好的组合模式的体现。

一个文件夹(树根root)下可能有多个文件夹(枝干Trunk),可能是单个的文件(树叶leaf)。

而枝干是可以继续向下延伸的,树叶则是树枝的端点,不能继续延伸。文件夹和文件也是如此。

同样如此,公司的结构也可以用组合模式展示。

一个总公司下可能两个子公司(Trunk),而子公司下可能有某个部门(leaf)。这种就是以树的形式展开的。

下面我就用公司的例子展示一下,组合模式的基本代码。

首先创建一个抽象类,代表一个抽象的根节点,而枝干、叶子都是由这个根节点抽象而来。

public abstract class AbstractRoot {private String name;public AbstractRoot(String name){this.name = name;}public abstract void show();}

实现枝干的逻辑。枝干是可以继续扩展的,因此应该有一个存储下一枝干、叶子的集合,同时有添加、删除叶子的方法:

/** * 枝干,可能有分支,所以要用一个list来添加和删除分支,分支可能是另一个分支或者是叶子 * @author xiaoqi * */public class Trunk extends AbstractRoot{private List<AbstractRoot> list = new ArrayList<>();String name;public Trunk(String name) {super(name);this.name = name;}@Overridepublic void show() {System.out.println("枝干:"+name);for(AbstractRoot root:list){root.show();}}/** * 添加子节点 */public void add(AbstractRoot child){list.add(child);}/** * 删除子节点 * @param chid */public void remove(AbstractRoot child){list.remove(child);}}
而子公司就是可以扩展下一部门的,因此子公司就是一个枝干。

叶子Leaf:叶子是没有继续下一节点的,因此它只能用来显示:


/** * 叶子是没有分支的,所以只能用来显示,并不能继续扩展了 * @author xiaoqi * */public class Leaf extends AbstractRoot{String name;public Leaf(String name) {super(name);this.name = name;}@Overridepublic void show() {System.out.println(name);}}

而公司的各个部门就是叶子,它下面就没有下一级单位了。

使用测试:

public class CompositeTest {public static void main(String[] args) {Trunk root = new Trunk("总公司");Trunk childCom1 = new Trunk("子公司1");Trunk childCom2 = new Trunk("子公司2");Leaf leaf1 = new Leaf("客服部");Leaf leaf2 = new Leaf("市场部");//总公司有两个分公司root.add(childCom1);root.add(childCom2);//分公司1有一个客服部childCom1.add(leaf1);//分公司2有一个市场部childCom1.add(leaf2);root.show();}}

首先创建一个“总公司”,为总公司添加两个子公司,

而两个子公司各自有两个不同的部门,因此可以继续各自添加。

部门是没有下一级单位的,因此不能操作了。

测试结果:

枝干:总公司枝干:子公司1客服部市场部枝干:子公司2

结果也和我们想的一样,是一个以“总公司”为根节点扩展的一个树形结构。


组合模式的基本使用就介绍到这了,关于更深的研究还是得在项目中才能理解。

1 0
原创粉丝点击