`

三十五:合成模式

阅读更多
合成模式是对象的结构模式,有时又叫做部分-整体模式。
一个基于继承的类型的等级结构便是一个树结构,一个基于合成的对象结构也是一个树结构,本章将要介绍的合成模式也是一个处理对象的树结构的模式。

一:有向树结构的种类
(A)由上向下的树图---每一个树枝节点都有箭头指向它的所有的子节点,从而一个客户端要求一个树枝节点给出所有的子节点,而一个节点却不知道它的父节点。
(B)由下向上的树图---在一个由下向上的树图中,每一个节点都有箭头指向它的父节点,但是一个父节点却不知道其子节点。
(C)双向的树图

二:安全式和透明式的合成模式
合成模式涉及到三个角色:
(A)抽象构件(Component角色):这是一个抽象角色,它给参加组合的对象规定一个接口,这个接口给出共有的接口及其默认的行为
(B)树叶构件(Leaf)角色:代表参加组合的树叶对象
(C)树枝构件(Composite)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为
合成模式根据所实现接口的区别分为两种形式,分别称为安全式和透明式。透明式在Component里面声明了所有的用来管理子类对象的方法,包括add(),remove和getChild方法,这样做的好处是所有的构件类都有相同的接口.安全式是在Composite类里面声明管理子类对象的方法.

三:下面是安全式的合成模式的源代码
package cai.milenfan.basic.test; 

public interface Component { 
//返回自己的实例
Component getComposite(); 
//某个商业方法
void sampleOperation(); 
} 


package cai.milenfan.basic.test; 

import java.util.Enumeration; 
import java.util.Vector; 

public class Composite implements Component{ 
private Vector componentVector = new java.util.Vector(); 
public Component getComposite() { 
return this; 
} 

public void sampleOperation() { 
Enumeration enumeration = components(); 
while(enumeration.hasMoreElements()){ 
((Component)enumeration.nextElement()).sampleOperation();
} 
} 

//聚集管理方法--添加一个子构件对象
public void add(Component component){ 
componentVector.addElement(component); 
} 

//聚集管理方法--删除一个子构件对象
public void remove(Component component){ 
componentVector.remove(component); 
} 

public Enumeration components(){ 
return componentVector.elements(); 
} 
} 


package cai.milenfan.basic.test; 

public class Leaf implements Component{ 
public Component getComposite() { 
//write you code here 
return null; 
} 
public void sampleOperation() { 
//write your code here 
} 
} 


四:下面是透明式的合成模式的源代码
与安全式的合成模式不同的是,透明式的合成模式要求所有的具体构件类,不论是树枝构件还是树叶构件,均符合一个固定的接口.角色和安全式的相同,代码如:
package cai.milenfan.basic.test; 

import java.util.Enumeration; 

public interface Component { 
//返回自己的实例
Component getComposite(); 
//某个商业方法
void sampleOperation(); 
//聚集的管理方法,增加一个子构件对象
void add(Component component); 
//聚集的管理方法,删除一个子构件对象
void remove(Component component); 
//聚集的管理方法,返回聚集的Enumeration对象
Enumeration components(); 
} 


package cai.milenfan.basic.test; 

import java.util.Enumeration; 
import java.util.Vector; 
//树枝构件角色实现了抽象构件角色所规定的所有接口,特别指出的是,树枝构件角色给出了管理聚集的所有方法
public class Composite implements Component{ 
private Vector componentVector = new java.util.Vector(); 
public Component getComposite() { 
return this; 
} 

public void sampleOperation() { 
Enumeration enumeration = components(); 
while(enumeration.hasMoreElements()){ 
((Component)enumeration.nextElement()).sampleOperation();
} 
} 

//聚集管理方法--添加一个子构件对象
public void add(Component component){ 
componentVector.addElement(component); 
} 

//聚集管理方法--删除一个子构件对象
public void remove(Component component){ 
componentVector.remove(component); 
} 

public Enumeration components(){ 
return componentVector.elements(); 
} 
} 


package cai.milenfan.basic.test; 

import java.util.Enumeration; 

public class Leaf implements Component{ 
public Component getComposite() { 
//write you code here 
return null; 
} 
public void sampleOperation() { 
//write your code here 
} 
public void add(Component component) { 
} 
public Enumeration components() { 
return null; 
} 
public void remove(Component component) { 
} 
} 

五:一个绘图的例子411
现给出一个绘图软件的例子,以说明合成模式的应用。一个绘系统给出各种工具用来描绘由线,长方形和圆形等基本图形组成的图形。显然,一个复合的图形既然是由这些基本图形组成的,那么全成模式就是一个合适的设计模式。下面给出安全合成模式的代码(透明式的自己写):

package cai.milenfan.basic.test; 
//这是一个抽象构件角色
public abstract class Graphics { 
public abstract void draw(); 
} 


package cai.milenfan.basic.test; 

import java.util.Vector; 

public class Picture extends Graphics{ 
private Vector list = new Vector(10); 
public void draw() { 
for(int i=0;i<list.size();i ){ 
Graphics g = (Graphics)list.get(i); 
g.draw(); 
} 
} 

//管理聚集的方法,增加一个子构件对象
public void add(Graphics g){ 
list.add(g); 
} 
//删除一个子构件对象
public void remove(Graphics g){ 
list.remove(g); 
} 
//返回一个子构件对象
public Graphics getChild(int i){ 
return (Graphics)list.get(i); 
} 
} 


package cai.milenfan.basic.test; 
//Line是一个树中构件,没有任何的子对象,因此不提供管理子对象聚集的方法
public class Line extends Graphics{ 
public void draw() { 
//write your code here 
} 
} 


//长方形,圆形的实现和Line的一样

六:awt库中的例子
由于awt和swing的图形界面构件是建立在awt库中的Container类和Component类上的,Button和Checkbox是树叶型的构件,而Container则是树枝型的构件.在Container类中,有操作聚集的方法,而在Component类中则没有这样的方法,这就是说awt中使用的合成模式是安全形式的合成模式.
在下面的情况下应当考虑使用合成模式:
(1)需要描述对象的部分和整体的等级结构
(2)需要客户忽略个体构件和组合构件的区别.
优点:可以很容易地增加新种类的构件。
缺点:使用继承的方法来增加新的行为很困难
分享到:
评论

相关推荐

    智慧运营,银行业竞争的下一个决胜之地——下一代中国银行业运营模式研究

    ●纵观全球三十年,运营转型是运营板块与业务和职能不断分工、进入到运营板块内的操作活动被不断优化的过程。从起步开始,海外银行运营转型经历三个阶段:“集中化’驱动的1.0到“精益化”驱动的2.0, 目前正在迈向...

    办公精灵(办公室文档批量处理好帮手)

    2、添加文件,有以下三种模式(以下均一致) (1)添加文件:可一次添加以上类型的多个文件 (2)添加目录:可添加一个文件夹中包含以上类型的文件 (3)拖拽文件及目录:可将文件目录及文件直接拖拽到表格中,自动将以上...

    Release20210507.zip

    2、添加文件,有以下三种模式(以下均一致) (1)添加文件:可一次添加以上类型的多个文件 (2)添加目录:可添加一个文件夹中包含以上类型的文件 (3)拖拽文件及目录:可将文件目录及文件直接拖拽到表格中,自动将以上...

    办公精灵V1.2.zip

    2、添加文件,有以下三种模式(以下均一致) (1)添加文件:可一次添加以上类型的多个文件 (2)添加目录:可添加一个文件夹中包含以上类型的文件 (3)拖拽文件及目录:可将文件目录及文件直接拖拽到表格中,自动将以上...

    ofbiz综合技术文档

    技术文档 5 第一部分、ofbiz表现 5 一、理解MVC模式 5 1、MVC理论描述 5 2、系统设计 6 3、OFBiz中MVC模式体现 7 二、JPublish合成表示层 8 1、经典的合成器--JPublish 8 ...第十三部分:JMX的用法 106

    2009达内SQL学习笔记

    五、ORDER BY 子句,排序 Order by:按某排序列表(默认升序 asc,由低到高;可加 desc,改成降序由高到低) 检索返回数据的顺序没有特殊意义,为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。 ...

    Dialogic从入门到系统工程师_完整版

    8.5.2 SRL三种基本编程模式的优点和弊端 190 8.5.3 SRL三种基本编程模式的选择标准 192 第九章 SRL高级概念及高级编程模式 193 9.1 SRL事件句柄定义及调用机制 193 9.1.1 回调函数定义 193 9.1.2 SRL回调机制 ...

    全字塔原理:思考、寫作、解決問題的邏輯方法

    如果水平的分類到達三至五項,最好給它們一個共同的「概括」──在本例中,「方向」就是「東西南北」的概括。  當讀者在建構知識時,原理及程序與上述思考「東西南北-方向」的關聯經驗,完全一模一樣。這本書就是...

    图形图像处理实用教程

    习题五 第6章 滤镜 6.1 滤镜概述 6.1.1 滤镜的基本概念 6.1.2 滤镜的基本操作与使用 6.2 模糊滤镜 6.2.1 模糊/进一步模糊 6.2.2 动感模糊滤镜 6.2.3 高斯模糊滤镜 6.2.4 径向模糊滤镜 6.3 扭曲滤镜 6.3.1 球面化与...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 ...

    JAVA上百实例源码以及开源项目

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    JAVA上百实例源码以及开源项目源代码

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

Global site tag (gtag.js) - Google Analytics