<设计模式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
结果也和我们想的一样,是一个以“总公司”为根节点扩展的一个树形结构。
组合模式的基本使用就介绍到这了,关于更深的研究还是得在项目中才能理解。
组合模式的结构就如同树状图一样。而树就是枝干、叶子的组合,组合模式可以形象的这么理解。
其实文件夹是一个很好的组合模式的体现。
一个文件夹(树根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设计模式(11) —<结构型>组合模式(Composite)
- 学习笔记——JAVA设计模式<8>组合模式
- (Boolan)C++设计模式 <十一> ——组合模式(Composite)、迭代器(Iterator)和责任链(Chain of Resposibility)
- <<cocoa设计模式>>
- 我的<<Head First 设计模式>>读后感整理
- 浅学设计模式之命令<command>模式
- 设计模式入门--设计模式学习笔记<一>
- 浅学设计模式之适配器<Adapter>模式 .
- C++设计模式--单一对象模式<Singleton>
- 浅学设计模式之状态<state>模式
- 浅学设计模式之外观<Facade>模式
- 浅学设计模式之外观<Facade>模式
- <转载>常见的23种设计模式
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- 设计模式阅读计划<Design Patterns.pdf,eng>
- 浅学设计模式之策略<Strategy>模式及在android中的使用
- 浅学设计模式之策略<Strategy>模式及在android中的使用
- 浅学设计模式之状态<state>模式
- 浅学设计模式之迭代器<Iterator>模式