一、组合模式概述

  将对象组合成树状结构以表示“部分和整体”层次结构,使得客户可以统一的调用叶子对象和容器对象。

  (1)组合模式的使用场景

      把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。

  (2)组合模式核心

      抽象构件(Component)角色:定义了叶子和容器构件的共同点

      叶子(Leaf)构件角色:无子节点

      容器(Composite)构件角色:有容器特征,可以包含子节点

 /**
* 抽象组件
* @author CL
*
*/
public interface Component {
void operation();
} /**
* 叶子组件
* @author CL
*
*/
interface Leaf extends Component {
} /**
* 容器组件
* @author CL
*
*/
interface Composite extends Component {
void add(Component c);
void remove(Component c);
Component getChild(int index);
}

二、组合模式工作流程分析

  (1)组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子。

  (2)当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员,并调用执行。其中,使用了递归调用的机制对整个结构进行处理。

三、使用组合模式模拟杀毒软件架构设计

 import java.util.ArrayList;
import java.util.List; /**
* 模拟杀毒软软件架构设计
* 抽象组件
* @author CL
*
*/
public interface AbstractFile {
/**
* 杀毒
*/
void killVirus();
} /**
* 对图片文件进行杀毒
* @author CL
*
*/
class ImageFile implements AbstractFile {
private String name; public ImageFile(String name) {
this.name = name;
} @Override
public void killVirus() {
System.out.println("-->对图像文件\""+name+"\"进行查杀!");
} } /**
* 对文本文件进行杀毒
* @author CL
*
*/
class TxtFile implements AbstractFile {
private String name; public TxtFile(String name) {
this.name = name;
} @Override
public void killVirus() {
System.out.println("-->对文本文件\""+name+"\"进行查杀!");
} } /**
* 对视频文件进行杀毒
* @author CL
*
*/
class VideoFile implements AbstractFile {
private String name; public VideoFile(String name) {
this.name = name;
} @Override
public void killVirus() {
System.out.println("-->对视频文件\""+name+"\"进行查杀!");
} } /**
* 容器组件
* @author CL
*
*/
class Folder implements AbstractFile {
private String name;
//容器:用来存放容器构建下的子节点
private List<AbstractFile> list; public Folder() {
list = new ArrayList<AbstractFile>();
} public Folder(String name) {
this();
this.name = name;
} public void add(AbstractFile file) {
list.add(file);
} public void remove(AbstractFile file) {
list.remove(file);
} public AbstractFile getChild(int index) {
return list.get(index);
} @Override
public void killVirus() {
System.out.println("-->文件夹\""+name+"\"进行查杀!"); for (AbstractFile file : list) {
file.killVirus(); //递归
}
} }

  测试:

 /**
* 使用组合模式模拟杀毒软件
* @author CL
*
*/
public class Client { public static void main(String[] args) {
//1. 将图片和文件加入到文件夹中,对文件夹进行查杀
Folder f1 = new Folder("我的文档");
AbstractFile f2, f3, f4, f5; f2 = new ImageFile("xaau.jpg");
f3 = new TxtFile("Hello.java");
f1.add(f2);
f1.add(f3); f1.killVirus(); System.out.println("-----------------------------------"); //2.在文件夹中再加入一个文件夹,其中包含两个视频文件
Folder f11 = new Folder("电影");
f4 = new VideoFile("宝贝计划.avi");
f5 = new VideoFile("泰囧.avi");
f11.add(f4);
f11.add(f5); f1.add(f11);
//对文件夹进行递归查杀
f1.killVirus();
}
}

  控制台输出:

-->文件夹"我的文档"进行查杀!
-->对图像文件"xaau.jpg"进行查杀!
-->对文本文件"Hello.java"进行查杀!
-----------------------------------
-->文件夹"我的文档"进行查杀!
-->对图像文件"xaau.jpg"进行查杀!
-->对文本文件"Hello.java"进行查杀!
-->文件夹"电影"进行查杀!
-->对视频文件"宝贝计划.avi"进行查杀!
-->对视频文件"泰囧.avi"进行查杀!

四、组合模式常用开发应用场景

  (1)操作系统的资源管理器;

  (2)GUI的容器层次图;

  (3)XML文件解析;

  (4)OA系统中,组织结构的处理;

  (5)Junit单元测试框架

      底层设计就是典型的组合模式,TestCase(叶子)、TestUnite(容器)、Test(抽象)

  (6)…………

GOF23设计模式之组合模式(composite)的更多相关文章

  1. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  2. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  3. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  4. 【GOF23设计模式】组合模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...

  5. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...

  6. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  7. 设计模式-12组合模式(Composite Pattern)

    1.模式动机 很多时候会存在"部分-整体"的关系,例如:大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.在软件开发中也是这样,例如,文件系统中的文件与文件夹.窗体 ...

  8. 设计模式 笔记 组合模式 Composite

    //---------------------------15/04/16---------------------------- //Composite 组合模式----对象结构型模式 /* 1:意 ...

  9. 【设计模式】—— 组合模式Composite

    前言:[模式总览]——————————by xingoo 模式意图 使对象组合成树形的结构.使用户对单个对象和组合对象的使用具有一致性. 应用场景 1 表示对象的 部分-整体 层次结构 2 忽略组合对 ...

随机推荐

  1. 利用Docker编译Hadoop 3.1.0

    前言 为什么要使用Docker编译,请自行百度 操作系统环境:Centos 6.8 uname -r 内核版本:2.6.32-642.el6.x86_64 除非有把握否则不要在Centos6.8中直接 ...

  2. ElasticSearch6.0 高级应用之 多字段聚合Aggregation(二)

    ElasticSearch6.0 多字段聚合网上完整的资料很少 ,所以作者经过查阅资料,编写了聚合高级使用例子 例子是根据电商搜索实际场景模拟出来的 希望给大家带来帮助! 下面我们开始吧! 1. 创建 ...

  3. TCP的数据传输

    TCP协议,传输控制协议(Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP通信需要经过创建连接.数据传送.终止连接三个步骤. ...

  4. flowable ContentEngine和ContentEngineConfiguration的关系

    一.CommandExecutor ContentEngineConfiguration继承自 AbstractEngineConfiguration. 在 AbstractEngineConfigu ...

  5. 主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现

    百度最近开源了一个新的关于主题模型的项目.文档主题推断工具.语义匹配计算工具以及基于工业级语料训练的三种主题模型:Latent Dirichlet Allocation(LDA).SentenceLD ...

  6. EasyPlayer Android基于ffmpeg实现播放(RTSP/RTMP/HTTP/HLS)同步录像功能

    之前有博客专门介绍了EasyPlayer的本地录像的功能,简单来说,EasyPlayer是一款RTSP播放器,它将RTSP流里的音视频媒体帧解析出来,并用安卓系统提供的MediaMuxer类进行录像. ...

  7. [Linux] 复制文件夹下指定创建时间的文件

    暂时不知道什么命令可以达到这个目标,目前的方法是分步进行: 首先,找出指定创建时间内的文件名 例如在imgs文件夹中,找出创建时间在一天内的文件 > feb_files.txt 然后将这些文件复 ...

  8. HDU 2268

    http://acm.hdu.edu.cn/showproblem.php?pid=2268 小学四年级应用题,让我找回了儿时的快乐... #include <iostream> #inc ...

  9. python爬虫入门(3)-环境搭建

    下载集成包 链接:http://pan.baidu.com/s/1pKD2zBP 密码:f75b 这里采用python2.7.9   安装步骤:1.安装python2.7(默认安装即可) 2.打开“运 ...

  10. DevExpress GridControl 显示外部图片

    如果数据源中只包含图片的链接,如何在DevExpress GridControl的一列中显示外部图片? 要实现该功能,可通过非绑定列的方式来实现.具体实现方法如下: 1.    创建了一个非绑定列并设 ...