您的位置:首页 > 编程语言 > Java开发

<设计模式12>组合模式

2016-09-06 20:51 197 查看
组合模式其实是一个很形象的模式。它也被称为部分整体模式。

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

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

一个文件夹(树根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;
}

@Override
public 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;
}

@Override
public 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


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

组合模式的基本使用就介绍到这了,关于更深的研究还是得在项目中才能理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 设计模式