第二十五章 合成模式
合成模型模式属于对象的结构模式,有时又叫做部分-整体模式。合成模式将对象组织到树结构中。可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。
合成模式的一个例子,道士的故事(从前有山又有庙的那个):
安全式和透明式的合成模式
安全方式是在Composite类里面声明所有的用来管理子类对象的方法。这样的做法是安全的做法,因为树叶类型的对象根本就没有管理子类对象的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错。编译通不过,就不会出现运行时期错误。
这个选择的缺点是不够透明,因为树叶类和合成类将具有不同的接口。
和透明方式各有优缺点,需要根据软件的具体情况做出选择。
类图如下:
代码如下:
package com.javapatterns.composite;
public interface Component {
Composite getComposite();
void sampleOperation();
}
package com.javapatterns.composite;
import java.util.Vector;
import java.util.Enumeration;
public class Composite implements Component
{
private Vector componentVector = new java.util.Vector();
public Composite getComposite()
{
return this;
}
public void sampleOperation()
{
java.util.Enumeration enumeration = components();
while (enumeration.hasMoreElements())
{
((Component)enumeration.nextElement()).sampleOperation();
}
}
public void add(Component component)
{
componentVector.addElement(component);
}
public void remove(Component component)
{
componentVector.removeElement(component);
}
public Enumeration components()
{
return componentVector.elements();
}
}
package com.javapatterns.composite;
public class Leaf implements Component {
public Composite getComposite(){
// Write your code here
return null;
}
public void sampleOperation(){
// Write your code here
}
}
可以看出安全式的合成模式leaf节点没有add remove等方法。树枝节点里面有一个容器vactor里面来放下面的所有类。
透明式的合成模式
与安全模式的合成模式不同的是,透明式的合成模式要求所有的具体构建类,不论树枝构建还是树叶构建,均符合一个固定的接口。透明式的合成模式的示意图如下:
源代码如下:
package com.javapatterns.composite.transparent;
import java.util.Enumeration;
public interface Component
{
void sampleOperation();
Composite getComposite();
void add(Component component);
void remove(Component component);
Enumeration components();
}
package com.javapatterns.composite.transparent;
import java.util.Vector;
import java.util.Enumeration;
public class Composite implements Component
{
private Vector componentVector = new java.util.Vector();
public Composite getComposite()
{
return this;
}
public void sampleOperation()
{
java.util.Enumeration enumeration = components();
while (enumeration.hasMoreElements())
{
((Component)enumeration.nextElement()).sampleOperation();
}
}
public void add(Component component)
{
componentVector.addElement(component);
}
public void remove(Component component)
{
componentVector.removeElement(component);
}
public Enumeration components()
{
return componentVector.elements();
}
}
package com.javapatterns.composite.transparent;
import java.util.Enumeration;
import java.util.Vector;
public class Leaf implements Component
{
private Vector componentVector = new java.util.Vector();
public void sampleOperation()
{
// Write your code here
}
public void add(Component component)
{
componentVector.addElement(component);
}
public void remove(Component component)
{
componentVector.removeElement(component);
}
public Composite getComposite()
{
// Write your code here
return null;
}
public Enumeration components()
{
// Write your code here
return null;
}
}
一个绘图的例子
安全式合成模式:
透明式合成模式:
picture是要画的类,其他的line等是叶子节点。
在下面的情况下应该考虑使用合成模式
1.需要描述对象的部分和整体的等级结构。
2.需要客户端忽略掉个体构件和组合构件的区别。客户端必须平等对待多有的构件,包括个体构件和组合构件。
3.合成模式可以很容易地增加新种类的构件。
4.使用合成模式可以使客户端变得很容易设计,因为客户端不需要知道构件是树叶构建还是树枝构建。
缺点:
使用合成模式后,控制树枝构件的类型就不太容易。
用集成的方法来增加新的行为很困难。
- 大小: 13 KB
- 大小: 14.6 KB
- 大小: 16.1 KB
- 大小: 11.4 KB
- 大小: 15 KB
分享到:
相关推荐
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...
我们并不认为这组设计模式是完整的和一成不变的,它只是我们目前对设计的思考的记录。因此我们欢迎广大读者的批评与指正,无论从书中采用的实例、参考,还是我们遗漏的已知应用,或应该包含的设计模式等方面。你...
设计模式的学习和应用分为几个阶段:首先自己学会设计模式,然后将其转化为自己的语言表达出来,接着是教授他人并最终记录下来。这种学习路径要求学习者不仅要理解设计模式本身,还要具备清晰的表达能力和深刻的理解...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它为解决特定问题提供了一套标准的解决方案。《设计模式精解——GoF 23种设计模式解析及C++实现源码...
2. **MVC模式**:这是一种软件设计模式,将业务逻辑、数据和用户界面分离,有利于提高代码的可维护性和可扩展性。 3. **毕设选题管理**:系统可能包括学生登录、查看题目、提交选题申请、查看申请状态等功能,同时...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 ##### 0.1 设计模式解析(总序) 设计模式是面向对象编程中用于解决常见问题的一系列模板。它们为软件设计提供了标准化的解决方案,帮助...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 ...
最出名的设计模式,语言诙谐明了。 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
### 设计模式精解—GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式作为一种重要的面向对象设计工具,在软件开发中扮演着至关重要的角色。本文旨在深入解析GoF(Gang of Four,四人组)提出的23种设计...
根据给定的信息,本文将深入探讨GoF23种设计模式的核心概念及其应用场景,并通过具体的实例来解析每一种设计模式的实现原理和技术要点。 ### 0. 引言 设计模式是一系列被广泛接受的解决方案,用于解决软件设计中...