组合模式
来源:互联网 发布:复杂网络期刊 sci 编辑:程序博客网 时间:2024/06/09 18:04
一、什么是组合模式?
将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、角色:
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component
子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除
三、类图
四、代码类
package com.qtong.util;
import java.util.ArrayList;
import java.util.List;
public class ComponentDemo {
public abstract class Component {
String name;
public abstract void add(Component c);
public abstract void remove(Component c);
public abstract void eachChild();
}
// 组合部件类
public class Leaf extends Component {
// 叶子节点不具备添加的能力,所以不实现
@Override
public void add(Component c) {
// TODO Auto-generated method stub
System.out.println("");
}
// 叶子节点不具备添加的能力必然也不能删除
@Override
public void remove(Component c) {
// TODO Auto-generated method stub
System.out.println("");
}
// 叶子节点没有子节点所以显示自己的执行结果
@Override
public void eachChild() {
// TODO Auto-generated method stub
System.out.println(name + "出山了。。。。。");
}
}
// 组合类
public class Composite extends Component {
// 用来保存节点的子节点
List<Component> list = new ArrayList<Component>();
// 添加节点 添加部件
@Override
public void add(Component c) {
// TODO Auto-generated method stub
list.add(c);
}
// 删除节点 删除部件
@Override
public void remove(Component c) {
// TODO Auto-generated method stub
list.remove(c);
}
// 遍历子节点
@Override
public void eachChild() {
// TODO Auto-generated method stub
System.out.println(name + "出山了。。。。");
for (Component c : list) {
c.eachChild();
}
}
}
public static void main(String[] args) {
ComponentDemo demo = new ComponentDemo();
// 构造根节点
Composite rootComposite = demo.new Composite();
rootComposite.name = "老大";
// 左节点
Composite compositeLeft = demo.new Composite();
compositeLeft.name = "左护卫";
// 构建右节点,添加两个叶子几点,也就是子部件
Composite compositeRight = demo.new Composite();
compositeRight.name = "右护卫";
Leaf leaf1 = demo.new Leaf();
leaf1.name = "右-子护卫1";
Leaf leaf2 = demo.new Leaf();
leaf2.name = "右-子护卫2";
compositeRight.add(leaf1);
compositeRight.add(leaf2);
// 左右节点加入 根节点
rootComposite.add(compositeRight);
rootComposite.add(compositeLeft);
// 遍历组合部件
rootComposite.eachChild();
}
}
执行结果:
老大出山了。。。。
右护卫出山了。。。。
右-子护卫1出山了。。。。。
右-子护卫2出山了。。。。。
左护卫出山了。。。。
五、适用场景
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
六、优缺点
优点:
组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
缺点:
在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- qt 打印调试信息
- ListView实现类似课程表,出诊表的表格样式
- 商品管理系统
- 利用MSER算法提取图像区域(车牌区域)的OpenCV代码~
- 针对sql错误:“除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效”的原理与解决
- 组合模式
- 基于CTP的程序化交易系统开发(三)
- 复杂正则表达式一
- PyGobject(二十六)布局容器之Popover
- style动画和背景暗色
- 欢迎使用CSDN-markdown编辑器
- hdu 1257 最少拦截系统(动态规划)
- linux定时任务的设置
- 编程与我