`

COMPOSITE(组合) ---- 对象结构型模式

 
阅读更多
1、意图
    将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
2、动机
    在绘图编辑器和图形捕捉系统这样的图形应用系统中,用户可以使用简单的组件创建复杂的图标。用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件。一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container)。
    然而这种方法存在一个问题:使用这些类的代码必须区别对待图元对象与容器对象,而实际上大多数情况下用户认为它们是一样的。对这些类区别对待,使得程序更加复杂。Composite模式描述了如何使用递归组合,使得用户不比对这些类进行区别,如下图所示。



    Composite模式的关键是一个抽象类,它既可以代表图元,又可以代表图元的容器。在图形系统中的这个类就是Graphic,它声明一些与特定图形对象相关的操作,例如Draw。同时它也声明了所有的组合对象共享的一些操作,例如一些操作用于访问和管理它的子部件。
    子类Line、Rectangle和Text(参见前面的类图)定义了一些图元对象,这些类实现Draw,分别用于绘制直线、矩形和正文。由于图元都没有子图形,因此它们都不执行与子类有关的操作。
    Picture类定义了一个Graphic对象的聚合。Picture的Draw操作时通过对它的子部件调用Draw实现的,Picture还用这种方法实现了一些与其子部件相关的操作。由于Picture接口与Graphic接口是一致的,因此Picture对象可以递归地组合其它Picture对象。
    下图是一个典型的由递归组合的Graphic对象组成的组合对象结构。



3、适用性
    以下情况使用Composite模式:
    你想表示对象的部分-整体层次结构
    你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的多有对象。
4、结构



5、参与者
Component(Graphic)
----为组合中的对象声明接口
----在适当的情况下,实现多有类共有接口的缺省行为。
----声明一个接口用于访问和管理Component的子组件
----(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。
Leaf(Rectangle、Line、Text等)
----在组合中表示叶节点对象,叶节点没有子节点。
----在组合中定义图元对象的行为。
Composite(Picture)
----定义有子部件的那些部件的行为
----存储子部件
----在Component接口中实现与子部件的有关操作
Client
----通过Component接口操纵组合部件的对象。
6、协作
    用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点则直接处理请求。如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。
7、代码示例

/** "Component" */
interface Graphic {
 
    //Prints the graphic.
    public void print();
}
 
/** "Composite" */
import java.util.List;
import java.util.ArrayList;
class CompositeGraphic implements Graphic {
 
    //Collection of child graphics.
    private List<Graphic> childGraphics = new ArrayList<Graphic>();
 
    //Prints the graphic.
    public void print() {
        for (Graphic graphic : childGraphics) {
            graphic.print();
        }
    }
 
    //Adds the graphic to the composition.
    public void add(Graphic graphic) {
        childGraphics.add(graphic);
    }
 
    //Removes the graphic from the composition.
    public void remove(Graphic graphic) {
        childGraphics.remove(graphic);
    }
}
 
/** "Leaf" */
class Ellipse implements Graphic {
 
    //Prints the graphic.
    public void print() {
        System.out.println("Ellipse");
    }
}
 
/** Client */
public class Program {
 
    public static void main(String[] args) {
        //Initialize four ellipses
        Ellipse ellipse1 = new Ellipse();
        Ellipse ellipse2 = new Ellipse();
        Ellipse ellipse3 = new Ellipse();
        Ellipse ellipse4 = new Ellipse();
 
        //Initialize three composite graphics
        CompositeGraphic graphic = new CompositeGraphic();
        CompositeGraphic graphic1 = new CompositeGraphic();
        CompositeGraphic graphic2 = new CompositeGraphic();
 
        //Composes the graphics
        graphic1.add(ellipse1);
        graphic1.add(ellipse2);
        graphic1.add(ellipse3);
 
        graphic2.add(ellipse4);
 
        graphic.add(graphic1);
        graphic.add(graphic2);
 
        //Prints the complete graphic (four times the string "Ellipse").
        graphic.print();
    }
}
  • 大小: 47.5 KB
  • 大小: 25.8 KB
  • 大小: 52.4 KB
分享到:
评论

相关推荐

    c++设计模式-结构型模式-组合模式

    c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式)

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) 体验课程

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) (Level 300)

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) (Level 300)

    C#面向对象设计模式纵横谈\9 结构型模式Composite组合模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第9节:结构型模式Composite组合模式

    组合模式 Composite Pattern

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及...这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

    组合模式(Composite Pattern)原理图

    组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...

    设计模式_组合模式.zip

    这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...

    设计模式可复用面向对象软件的基础.zip

    4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 ...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) C#面向对象设计模式纵横谈(11):Facade 外观模式(结构型模式) C#面向对象设计...

    C#设计模式结构型

    C#设计模式-结构型相关课件 合成模式(Composite) • 设计方案一: 合成模式(Composite) • 设计方案二 合成模式(Composite) • 设计方案一和设计方案二的区别 – 设计方案二使得客户端更不需要关心所需处理的...

    设计模式--C++

    4.3 Composite(组成)—对象结构型模式 107 4.4 Decorator(装饰)—对象结构型模式 115 4.5 FACADE(外观)—对象结构型模式 121 4.6 Flyweight(享元)—对象结构型模式 128 4.7 Proxy(代理)—对象结构型模式 ...

    设计模式:可复用面向对象软件的基础--详细书签版

    4.3 composite(组成)—对象结构型 模式 107 4.4 decorator(装饰)—对象结构型 模式 115 4.5 facade(外观)—对象结构型 模式 121 4.6 flyweight(享元)—对象结构型 模式 128 4.7 proxy(代理)—对象...

    PHP设计模式(七)组合模式Composite实例详解【结构型】

    本文实例讲述了PHP设计模式:组合模式Composite。分享给大家供大家参考,具体如下: 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面。 例子1:就是多级树形菜单。 例子2:文件和...

    《设计模式可复用面向对象软件的基础》

    843.6 创建型模式的讨论 89第4章 结构型模式 914.1 Adapter(适配器)—类对象结构型模式 924.2 Bridge(桥接)—对象结构型模式 1004.3 Composite(组成)—对象结构型模式 1074.4 Decorator(装饰)—对象结构型...

    软件设计师必读的书-设计模式

    4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 ...

    design-pattern-java.pdf

    七个结构型模式 七个结构型模式 适配器模式-Adapter Pattern 不兼容结构的协调——适配器模式(一) 不兼容结构的协调——适配器模式(二) 不兼容结构的协调——适配器模式(三) 不兼容结构的协调——适配器模式...

    设计模式可复用面向对象软件的基础.

    4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 ...

    设计模式:可复用面向对象软件的基础

    4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 ...

    《设计模式》中文版(23个设计模式的介绍与运用)

    4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 ...

Global site tag (gtag.js) - Google Analytics