Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

目录

组合模式

简介

将对象组合成【树】形结构以表示【部分-整体】的层次结构,组合模式使得用户对【单个对象】和对【组合对象】的使用具有一致性。

组合模式有时候又叫做部分-整体模式,它使我们在树型结构的问题中,模糊了简单元素和复杂元素的概念。

当发现需求中是体现部分与整体层次结构,并且你希望用户可以忽略组合对象与单个对象的不同,以统一的方式使用组合结构中的所有对象时,就应该考虑组合模式了。

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。

组合模式让你可以优化处理【递归】或【分级】数据结构。

关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的文件系统。文件系统由目录和文件组成,每个目录都可以装内容,目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式。

涉及角色:

  • Component:为参加组合的对象声明一个公共接口,不管是组合还是叶结点都实现这个接口
  • Leaf:在组合中表示叶子结点对象,叶子结点没有子结点
  • Composite:表示组合中有子结点的对象

特点:使得客户端看来单个对象和对象的组合是同等的。换句话说,某个类型的方法同时也接受自身类型作为参数。

例如:

java.util.List#addAll(Collection)

案例

Component:为参加组合的对象声明一个公共接口

public abstract class Component {
/**表示直接叶子节点(直接下属团队成员)的集合 */
protected List<Component> employList;
public String name; public final void display() {
System.out.println(name);//打印自己
display(employList);//打印子节点
} private final void display(List<Component> list) {
if (list != null) {
for (int i = 0; i < list.size(); i++) {
Component sonComponent = list.get(i);//子节点
System.out.println(sonComponent.name);//打印子节点
List<Component> sonList = sonComponent.employList;//子节点的节点集合
if (sonList != null) {//不为空说明是非叶子节点
display(sonList); //递归
}
}
}
} public abstract boolean add(Component employer);
public abstract boolean delete(Component employer);
}

Leaf:组合中的叶子结点对象,叶子结点没有子结点

public class Leaf extends Component {
public Leaf(String name) {
this.name = name;
this.employList = null;//没有叶子节点
} @Override
public boolean add(Component employer) {
throw new RuntimeException("叶子结点没有子结点");
}
@Override
public boolean delete(Component employer) {
throw new RuntimeException("叶子结点没有子结点");
}
}

Composite:组合中有子结点的对象

public class Composite extends Component {
public Composite(String name) {
this.name = name;
this.employList = new ArrayList<Component>();
} @Override
public boolean add(Component employer) {
return this.employList.add(employer);
}
@Override
public boolean delete(Component employer) {
return this.employList.remove(employer);
}
}

演示

public class Test {
public static void main(String[] args) {
Component employer1 = new Composite("【项目经理一】");
Component employer11 = new Leaf("包青天");
Component employer12 = new Leaf("白乾涛");
Component employer13 = new Leaf("baiqiantao"); Component employer2 = new Composite("【项目经理二】");
Component employer21 = new Leaf("bqt"); Component employer3 = new Composite("boss");
employer3.add(employer1);// 为boss添加一个非叶子节点
employer3.add(employer2); employer1.add(employer11);// 为项目经理添加一个叶子节点
employer1.add(employer12);
employer1.add(employer13); employer2.add(employer21); employer11.display();
System.out.println("----------------------------------");
employer1.display();
System.out.println("----------------------------------");
employer2.display();
System.out.println("----------------------------------");
employer3.display();
System.out.println("----------------------------------"); System.out.println(employer2.add(employer21));//true
System.out.println(employer2.delete(employer11));//false
employer2.display();
}
}

2016-10-31

Composite 组合模式的更多相关文章

  1. C++设计模式-Composite组合模式

    Composite组合模式作用:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. UML图如下: 在Component中声明所有用来 ...

  2. 十一、Composite 组合模式

    原理: 代码清单 Entity public abstract class Entry { public abstract String getName(); public abstract int ...

  3. Composite组合模式(结构型模式)

    1.概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2.案例 需要构建一个容器系统,需要满足以下几点要求: (1). ...

  4. 设计模式08: Composite 组合模式(结构型模式)

    Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface I ...

  5. 一天一个设计模式——Composite组合模式

    一.模式说明 能够使容器与内容物具有一致性,创造出递归结构的模式就是Composite组合模式. 举个例子:计算机中的文件系统中有文件和文件夹的概念,我们知道,文件夹可以包含文件,也可以包含子文件夹, ...

  6. java实现Composite(组合)模式

    组合模式涉及的是一组对象,其中一些对象可能含有其他对象,这些对象也可以含有对象,因此,有些对象代表的是对象群组. Composite模式的设计意图在于:让所有的用户能够用统一的接口处理单个对象以及对象 ...

  7. 设计模式(九):Composite组合模式 -- 结构型模式

    1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对 ...

  8. 设计模式C++学习笔记之十五(Composite组合模式)

      15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合的使用具有一致性. main(),客户 CCorpNode,抽象基类,实现基本信 ...

  9. 设计模式(9)--Composite(组合模式)--结构型

    1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...

随机推荐

  1. opencv 2.46与visual studio 2012 配置方法

    一开学就搞实训,还是没学过的图像处理.痛苦啊!图像处理时一般使用Matlab中的图像工具箱,或者是C/C++和OpenCV结合使用.以前看过一些关于opencv的文章,没想到现在要用上了. 把搭建开发 ...

  2. 3、MyBatis.Net学习笔记之增删改

    增删改之前先说一下笔记1里提到的一个无法创建ISqlMapper对象的问题. <resultMaps> <resultMap id="FullResultMap" ...

  3. windows 下安装nodejs及其配置环境

    第一步:下载安装文件下载nodejs,官网:http://nodejs.org/download/,我这里下载的是node-v0.10.28-x86.msi,如下图: 第二步:安装nodejs下载完成 ...

  4. 【面试】惠普IT电面

    1.英文自我介绍 一定要事先准备,逻辑要清晰 2.英文项目介绍

  5. Labeling Balls

    poj3687:http://poj.org/problem?id=3687 题意:有N个重量1到N的点,把这N个点涂色,要求在一定的约束下颜色a必须比颜色b要轻,如果有多种选择则让重量最小的对应编号 ...

  6. LINUX下安装ORACLE,完全搞定

    参考文档: http://www.tuicool.com/articles/eE3mmy http://blog.chinaunix.net/uid-11209572-id-3599052.html

  7. stat~~~访问文件状态的利器

    Name stat, fstat, lstat - get file status Synopsis #include <sys/types.h>#include <sys/stat ...

  8. bzoj2424

    比较简单的费用流,一目了然 ; type node=record next,point,flow,cost:longint; end; ..] of node; q:..] of longint; p ...

  9. delphi record 内存怎么释放

    delphi record 内存怎么释放 是不需要释放的,除非你使用指针方式生成的.

  10. B - Frogger

    题目大意: 一个叫做弗雷迪的青蛙坐在湖中间的一块石头上.突然他注意到他的青蛙女神菲奥娜坐在另一块石头上面,于是他计划去看她,但是呢湖里面的水很脏并且充满了游客的防晒霜,所以他想避免游泳而采用跳跃的方式 ...