设计模式总结篇系列:组合模式(Composite)

在探讨Java组合模式之前,先要明白几个概念的区别:继承、组合和聚合。

继承是is-a的关系。组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系。

组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象。如人和手之间的关系,人都没了,还何来手?

聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等函数形式),如人有一台电脑的关系。

总体说来,组合关系相对聚合而言整体和部分关系感更强一些。

回到正题,组合模式中当然在组合对象中含有被组合对象的引用,只是不同的是,组合模式在概念上更加严格,通常是指引用的被组合对象类型就是组合对象的类型。如此一来,使得组合对象和被组合对象处理起来具有一致性。当然,前提是组合被对象和被组合对象在本身的概念层次上具有此一致性。

最为经典的体现组合模式的例子是具有树形结构特点的类定义。对于树形结构中的每个结点,由于父结点的孩子节点有可能是有自己的孩子结点,因此,利用组合模式,将所有结点统一设计成同一种类型即可。

1.定义树中结点类, 每个结点都有结点名称,父节点和孩子结点:


 1 class TreeNode {
2
3 private String name;
4 private TreeNode parent;
5 private Vector<TreeNode> children = new Vector<TreeNode>();
6
7 public TreeNode() {
8 }
9
10 public TreeNode(String name) {
11 this.name = name;
12 }
13
14 public String getName() {
15 return name;
16 }
17
18 public void setName(String name) {
19 this.name = name;
20 }
21
22 public TreeNode getParent() {
23 return parent;
24 }
25
26 public void setParent(TreeNode parent) {
27 this.parent = parent;
28 }
29
30 public Vector<TreeNode> getChildren() {
31 return children;
32 }
33
34 public void setChildren(Vector<TreeNode> children) {
35 this.children = children;
36 }
37
38 // 添加孩子结点
39 public void addChild(TreeNode child) {
40 children.add(child);
41 }
42
43 // 删除子结点
44 public void removeChild(TreeNode child) {
45 children.remove(child);
46 }
47
48 // 获取子结点
49 public Enumeration<TreeNode> getChileren() {
50 return children.elements();
51 }
52
53 }

2.客户端类,创建树:


 1 public class Tree {
2
3 private TreeNode root;
4
5 public Tree() {
6
7 }
8
9 public Tree(String treeName) {
10 root = new TreeNode(treeName);
11 }
12
13 public static void main(String[] args) {
14 Tree tree = new Tree("A");
15 TreeNode nodeB = new TreeNode("B");
16 TreeNode nodeC = new TreeNode("C");
17 nodeB.addChild(nodeC);
18 tree.root.addChild(nodeB);
19 System.out.println("build the tree finished!");
20 }
21
22 }

设计模式总结篇系列:组合模式(Composite),布布扣,bubuko.com

时间: 2024-10-07 05:50:25

设计模式总结篇系列:组合模式(Composite)的相关文章

设计模式(七)组合模式Composite(结构型)

设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

设计模式(二)组合模式Composite(表达式求值)

组合模式目标:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. 透露一下:这个例子可以说是组合模式的典型应用,据说(作者说)某个编译器开发团队用了两个半月的时间实现了表达式求值,被作者用十几行代码就这样实现了. 需求:表达式求值,是编译器的重要组件,本例你能找到的实际代码应该不多,因为是本人根据<C++沉思录>里面的例子亲自敲出来的(当然都是作者的功劳).目的在于支持各种一元运算,二元运算甚至更多的运算都加入到表达式求值中,程序方便扩展

设计模式(八)组合模式 Composite

组合模式: 允许你将对象组合成树形结构来表现“整体/部分”层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 组合模式适用于创建复杂的对象,这个对象包含某些个别的对象以及这些对象的组合. 从操作的角度而言,客户端对于 个别对象/组合 的操作是一致的. 模拟场景 如图所示,总公司下属有多个部门,而子公司可以视为多个部门的组合. 整个数据结构呈树状,完美契合组合模式的应用场景. UML: 在这个场景中: 个别对象 -> 人事部(HRDepartment)和财务部(FinanceDepart

Headfirst设计模式的C++实现——组合模式(Composite)

menu_component.h 1 #ifndef _MENU_COMPONENT_H_ 2 #define _MENU_COMPONENT_H_ 3 4 #include <string> 5 6 class MenuComponent { 7 public: 8 class Iterator { 9 public: 10 virtual bool has_next() = 0; 11 12 virtual MenuComponent *next() = 0; 13 }; 14 15 Me

设计模式总结篇系列:策略模式(Strategy)

前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结构型模式:主要侧重于处理类或对象的组合: 行为型模式:主要侧重于类或对象之间的交互以及职责分配. 首先了解下策略模式的概念:定义了多个算法,并将它们封装起来(一般的是每个算法封装成一个单独的类),让算法独立于客户端而可以单独变化. 具体可以看一下下面的例子(以计算加.减.乘为例): 1. 对加.减.

设计模式总结篇系列:桥接模式(Bridge)

在实际类设计过程中,有时会遇到此类情况:由于实际的需要,某个类具有两个或两个以上的维度变化,如果利用继承将每种可能的变化情况都定义成一个类,一是会导致类膨胀的问题,二是以后不太好维护和并且违背类的设计原则.那么面对这种情况,类改如何设计呢?这就是本文所要讲到的桥接模式. 简单的讲,桥接模式是指:将抽象和行为划分开来,从而将各个可能变化的维度分离开来,各自独立成一个类,但是能够动态的组合. 貌似有点抽象,下面通过一个简单的例子来理解桥接模式. 我们可以通过Email发送信息,也可以手段短信发送信息

设计模式 - 组合模式(composite pattern) 详解

组合模式(composite pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 组合模式: 允许你将对象组合成树形结构来表现"整体/部分"层次结构. 组合能让客户以一致的方法处理个别对象以及组合对象. 建立组件类(Component), 组合类(composite)和叶子类(leaf)继承组件类, 客户类(client)直接调用最顶层的组合类(composite)即可. 具体方法: 1. 组件类(component), 包含组合

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以