设计模式总结篇系列:组合模式(Composite)
2014-06-02 10:49
555 查看
在探讨Java组合模式之前,先要明白几个概念的区别:继承、组合和聚合。
继承是is-a的关系。组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系。
组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象。如人和手之间的关系,人都没了,还何来手?
聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等函数形式),如人有一台电脑的关系。
总体说来,组合关系相对聚合而言整体和部分关系感更强一些。
回到正题,组合模式中当然在组合对象中含有被组合对象的引用,只是不同的是,组合模式在概念上更加严格,通常是指引用的被组合对象类型就是组合对象的类型。如此一来,使得组合对象和被组合对象处理起来具有一致性。当然,前提是组合被对象和被组合对象在本身的概念层次上具有此一致性。
最为经典的体现组合模式的例子是具有树形结构特点的类定义。对于树形结构中的每个结点,由于父结点的孩子节点有可能是有自己的孩子结点,因此,利用组合模式,将所有结点统一设计成同一种类型即可。
1.定义树中结点类, 每个结点都有结点名称,父节点和孩子结点:
2.客户端类,创建树:
继承是is-a的关系。组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系。
组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象。如人和手之间的关系,人都没了,还何来手?
聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等函数形式),如人有一台电脑的关系。
总体说来,组合关系相对聚合而言整体和部分关系感更强一些。
回到正题,组合模式中当然在组合对象中含有被组合对象的引用,只是不同的是,组合模式在概念上更加严格,通常是指引用的被组合对象类型就是组合对象的类型。如此一来,使得组合对象和被组合对象处理起来具有一致性。当然,前提是组合被对象和被组合对象在本身的概念层次上具有此一致性。
最为经典的体现组合模式的例子是具有树形结构特点的类定义。对于树形结构中的每个结点,由于父结点的孩子节点有可能是有自己的孩子结点,因此,利用组合模式,将所有结点统一设计成同一种类型即可。
1.定义树中结点类, 每个结点都有结点名称,父节点和孩子结点:
class TreeNode { private String name; private TreeNode parent; private Vector<TreeNode> children = new Vector<TreeNode>(); public 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 Vector<TreeNode> getChildren() { return children; } public void setChildren(Vector<TreeNode> children) { this.children = children; } // 添加孩子结点 public void addChild(TreeNode child) { children.add(child); } // 删除子结点 public void removeChild(TreeNode child) { children.remove(child); } // 获取子结点 public Enumeration<TreeNode> getChileren() { return children.elements(); } }
2.客户端类,创建树:
public class Tree { private TreeNode root; public Tree() { } public Tree(String treeName) { root = new TreeNode(treeName); } public static void main(String[] args) { Tree tree = new Tree("A"); TreeNode nodeB = new TreeNode("B"); TreeNode nodeC = new TreeNode("C"); nodeB.addChild(nodeC); tree.root.addChild(nodeB); System.out.println("build the tree finished!"); } }
相关文章推荐
- 设计模式总结篇系列:组合模式(Composite)
- [设计模式]_[中级]_[组合模式(Composite)分析与总结]
- C#设计模式系列:组合模式(Composite)
- 设计模式实践系列 (2) - 组合模式 ( Composite )
- 设计模式总结之Composite Pattern(组合模式)
- [设计模式]_[中级]_[组合模式(Composite)分析与总结]
- 设计模式学习系列六:组合模式(composite)
- 设计模式笔记--结构型模式之三--组合模式 Composite
- Javascript乱弹设计模式系列(4) - 组合模式(Composite)
- 设计模式之Composite(组合)
- C#设计模式之组合(Composite)
- C#设计模式之组合(Composite)
- 设计模式之Composite(组合)
- Javascript乱弹设计模式系列(4) - 组合模式(Composite)
- 设计模式之Composite(组合)
- 结构模式——设计模式之Composite(组合)[转载自http://www.jdon.com/]
- 设计模式(10)-组合模式(Composite)
- 设计模式 --- 组合模式(Composite) 精选经验合集
- 设计模式之Composite(组合)
- 窥视设计模式之组合模式(composite)