Structual设计-Composite形式
Structual设计--Composite模式
1.意图
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
2.别名
无
3.动机
在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表。用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件。一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container)。
然而存在一个问题:使用这些类的代码必需区别对待图元对象和容器对象,而实际上大多数情况下用户认为他们是一样的。对这些类区别使用,使得程序更加复杂。Composite模式描述了如何使用递归组合,使得用户不必对这些类进行区别。
4.适用性
以下情况使用Composite:
- 你想表示对象的整体-部分层次结构。
- 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
5.结构
组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图:
6.代码示例
看下代码:
public class TreeNode {
private String name;
private TreeNode parent;
private Vector<TreeNode> children = new Vector<TreeNode>();
public TreeNode(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TreeNode getParent() {
return parent;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
//添加孩子节点
public void add(TreeNode node){
children.add(node);
}
//删除孩子节点
public void remove(TreeNode node){
children.remove(node);
}
//取得孩子节点
public Enumeration<TreeNode> getChildren(){
return children.elements();
}
}
调用者:
public class Tree {
TreeNode root = null;
public Tree(String name) {
root = new TreeNode(name);
}
public static void main(String[] args) {
Tree tree = new Tree("A");
TreeNode nodeB = new TreeNode("B");
TreeNode nodeC = new TreeNode("C");
nodeB.add(nodeC);
tree.root.add(nodeB);
System.out.println("build the tree finished!");
}
}
其中TreeNode作为组合器,使用场景:将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树,数等。
7.相关模式
- 通常部件-父部件连接用于Responsibility of Chain模式(责任链)。
- Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,他们通常有一个公共的父类。因此装饰必须支持具有add,remove和GetChild操作的Component接口。
- Flyweight让你共享组件,但不在能引用他们的父部件。
- Itertor可以来遍历Composite
- Visitor将本来应该分布在Composite和leaf类中的操作和行为局部化。
引用:
http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539