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 组合模式 树 递归 MD的更多相关文章

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

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

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

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

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

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

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

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

  5. 十一、Composite 组合模式

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

  6. Composite 组合模式

      简介         <大话设计模式>一书中组合模式的定义为:将对象组合成[树]形结构以表示[部分-整体]的层次结构,组合模式使得用户对[单个对象]和对[组合对象]的使用具有一致性. ...

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

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

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

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

  9. [C++设计模式] composite 组合模式

    组合(Composite)模式的其他翻译名称也非常多,比方合成模式.树模式等等.在<设计模式>一书中给出的定义是:将对象以树形结构组织起来,以达成"部分-总体"的层次结 ...

随机推荐

  1. Rsync服务部署使用

    rsync服务搭建过程(daemon模式) 配置服务 在/etc/rsyncd.conf文件中写入相应的配置: uid = root gid = root use chroot = no max co ...

  2. 详解Python中的__init__和__new__(静态方法)

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: #-*- co ...

  3. Template(Updating)

    1.Splay (Tyvj1728) #include <bits/stdc++.h> using namespace std; ,INF=<<; ],sz[MAXN],cnt ...

  4. AGC009D Uninity

    一些无关紧要的事: 似乎很久没写题解了……象征性地更一篇.另外很多blog都设了私密,不是很敢公开,不过说不定哪天会公开的. link 题意: 最优树的点分治:使得点分最大层数最小.(听说是经典问题) ...

  5. Java基础学习——多线程之线程池

    1.线程池介绍     线程池是一种线程使用模式.线程由于具有空闲(eg:等待返回值)和繁忙这种不同状态,当数量过多时其创建.销毁.调度等都会带来开销.线程池维护了多个线程,当分配可并发执行的任务时, ...

  6. hdu 3879 方案选择

    每日一水--- #include <cstdio> #include <cstring> #include <vector> #define oo 0x3f3f3f ...

  7. UOJ 12 猜数 数学题

    [UER #1]猜数 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n 的值.然后在脑内把 n 写成了 a ...

  8. Python学习笔记(三):随机生成函数方法

    本文是在Python2下总结! Python中的random模块用于生成随机数,如果想生成随机数需要先导入random的模块然后才能使用其中的方法,下面简单介绍一下常用的结果函数方法: 1·.rand ...

  9. 基于(Redis | Memcache)实现分布式互斥锁

    设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存击穿 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则 ...

  10. ROS知识(8)----CMakeLists.txt文件编写的理解

    ROS(Indigo)编程必须要理解CMakeList.txt的编写规则,教程地址:catkin/CMakeLists.txt,官网有相关的教程,中文的翻译版本写的很不错,教程地址:ROS中的CMak ...