设计模式:组合(Composite)模式

一、前言

  关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序的,肯定少不了定义一些组件,初始化之后,然后使用容器的add方法,将这些组件有顺序的组织成一个界面出来;或者读者如果编写过前端的页面,肯定使用过<div>等标签定义一些格式,然后格式之间互相组合,通过一种递归的方式组织成相应的结构,这种方式其实就是组合,将部分的组件镶嵌到整体之中;又或者文件和文件夹的组织关系,通过目录表项作为共同的特质(父类),一个文件夹可以包含多个文件夹和多个文件,一个文件容纳在一个文件夹之中。那么凭什么可以这样做呢,需要满足以下两点,首先整体的结构应该是一棵树,第二,所有的组件应该有一个共同的父类(有共同的本质),这个父类使得组件中的共同的本质可以提取出来(有了共同语言(父类)),进行互融,其实就是父类使用add方法,这样子类就可以通过抽象的方式通过父类来表达了,可能有点绕口,让我们看一个例子。

二、代码

Entry 抽象类:共同特质
 package zyr.dp.composite;

 public abstract class Entry {
public abstract String getName();
public abstract int getSize();
public abstract void printList(String prefix);
public void printList(){
printList("");
}
public Entry add(Entry entry) throws RuntimeException{
throw new RuntimeException();
}
public String toString(){
return getName()+"<"+getSize()+">";
}
}

  File 类:实现类,叶子结点

 package zyr.dp.composite;

 public class File extends Entry {

     private String name;
private int size;
public File(String name,int size){
this.name=name;
this.size=size;
}
public String getName() {
return name;
} public int getSize() {
return size;
} public void printList(String prefix) {
System.out.println(prefix+"/"+this);
} }
Directory 类:可扩充节点(中间节点)
 package zyr.dp.composite;

 import java.util.ArrayList;
import java.util.Iterator; public class Directory extends Entry { String name;
ArrayList entrys=new ArrayList();
public Directory(String name){
this.name=name;
}
public String getName() {
return name;
} public int getSize() {
int size=0;
Iterator it=entrys.iterator();
while(it.hasNext()){
size+=((Entry)it.next()).getSize();
}
return size;
} public Entry add(Entry entry) {
entrys.add(entry);
return this;
} public void printList(String prefix) {
System.out.println(prefix+"/"+this);
Iterator it=entrys.iterator();
Entry entry;
while(it.hasNext()){
entry=(Entry)it.next();
entry.printList(prefix+"/"+name);
}
} }

  Main类:组合组件

package zyr.dp.composite;

public class Main {

    public static void main(String[] args) {

        Directory root=new Directory("根目录");

        Directory life=new Directory("我的生活");
File eat=new File("吃火锅",100);
File sleep=new File("睡觉",100);
File study=new File("学习",100);
life.add(eat);
life.add(sleep);
life.add(study); Directory work=new Directory("我的工作");
File write=new File("写博客",200);
File paper=new File("写论文",200);
File homework=new File("写家庭作业",200);
work.add(write);
work.add(paper);
work.add(homework); Directory relax=new Directory("我的休闲");
File music=new File("听听音乐",200);
File walk=new File("出去转转",200);
relax.add(music);
relax.add(walk); Directory read=new Directory("我的阅读");
File book=new File("学习书籍",200);
File novel=new File("娱乐小说",200);
read.add(book);
read.add(novel); root.add(life);
root.add(work);
root.add(relax);
root.add(read); root.printList("D:");
System.out.println("=================");
work.printList("work");
System.out.println("=================");
novel.printList("novel"); } }

 运行结果:

三、总结

  由此可见,我们以前使用的“容器+内容”,其实是通过组合模式实现的,组合模式保证了容器和内容的一致性,容器里面可以套容器,也可以放内容,但是内容已经是叶子结点了,不能继续扩充,还记得我们在抽象工厂方式中使用的模式之中,为了将零件组装成产品,我们就使用了组合模式,非常的有意思,通过递归来遍历所有的内容。组合模式在我们的生活中使用的非常普遍,我们一定要使用好这个模式,理解其中的抽象,特别是add()的定义,抽象类和实现类之间的参数传递,这点至关重要,当然我们又使用了模板方法和迭代器,希望大家能明白模式之间的联系以及相互使用的道理。

  程序代码

设计模式:组合(Composite)模式的更多相关文章

  1. Java 实现组合(Composite)模式

    类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...

  2. 设计模式之——Composite模式

    composite模式又叫做组合模式/复合模式. 它是一种能够使容器与内容具有一致性,创造出递归结构的模式. 示例程序是列出文件夹以及其内部文件与文件夹一览的功能: 可以由示例图看出,有一个电影文件夹 ...

  3. C++设计模式实现--组合(Composite)模式

    一. 举例 这个样例是书上的,如果有一个公司的组结结构例如以下: 它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点. 并且最关健的是,它的每一层结构非常相似. 代码实现例 ...

  4. 设计模式C++描述----11.组合(Composite)模式

    一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...

  5. Head First 设计模式 —— 11. 组合 (Composite) 模式

    思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...

  6. 设计模式之Composite模式(笔记)

    组合模式:将对象组合成树形结构以表示"部分-总体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 适用场合:当需求中是体现部分与总体层次的结构时,以及希望用户 ...

  7. 组合(composite)模式

    定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象.组 ...

  8. 八、结构模式之组合(Composite)模式

    组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...

  9. 设计模式:composite模式

    目的:使容器和内容具备一致性 实现:将对象组合成树形结构以表示“部分-整体”的层次结构 实例:文件夹中可以包含文件夹也可以包含文件 例子: class Item //接口定义 { public: vi ...

  10. php 设计模式 --组合器模式

    PHP 开启错误显示并设置错误报告级别 ini_set('error_reporting', E_ALL); ini_set('display_errors', 'on');   目的:分级处理:整体 ...

随机推荐

  1. WCF系列教程之初识WCF

    本随笔参考自WCF编程系列(一)初识WCF,纯属读书笔记,加深记忆. 1.简介:Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程 ...

  2. java.utils.UUID类介绍

    1 UUID介绍 UUID (Universally Unique Identifier)缩写,即通用唯一识别码,也是被开源软件基金会 (Open Software Foundation, OSF) ...

  3. Python 如何计算当前时间减少或增加一个月

    问题 今天在之前的代码中发现了一个bug,有个计算当前时间减少一个月的函数,其报出下面的异常信息: ValueError: day is out of range for month 看一下代码: i ...

  4. C 标准库 - string.h之strncpy使用

    strncpy 把 src 所指向的字符串复制到 dest,最多复制 n 个字符.当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充. char *strncpy(char *dest ...

  5. WPF的菜单栏,工具栏的简单使用

    1. 界面效果如下: 2. 页面 .xaml代码如下: <Window x:Class="MenuAndToolBar.MainWindow" xmlns="htt ...

  6. 【c++】流状态的查询和控制

    源自 c++primer 4th, 248页 代码 #include <iostream> #include <limits> #include <stdexcept&g ...

  7. js验证身份证号码是否合规

    需求:最近要做实名验证的功能,但是验证身份证号码和身份证图片的接口不想短信,比较贵,所以之前我们要验证严谨一点,参考了网上关于验证身份证号码的代码,总结一下 代码: //验证身份证号码 functio ...

  8. 使用union合并查询

    语法: select …..from 表1 union select ……from 表2 2. 合并查询的特点 ① 合并的表中的列的个数.数据类型必须相同或向兼容. ② union默认去掉重复值,如果 ...

  9. Jquery+Aajax 批量上传

    注:转载请标明文章原始出处及作者信息 网上有现成的Uploadify.WebUpload等插件,自己写一个简单的(非插件). 1.页面 批量上传页面 <form action="&qu ...

  10. Java API 之 Annotation功能

    JDK1.5开始增加了Annotation功能,该功能可用于: 1.类: 2.构造方法: 3.成员变量: 4.方法 5.参数 等的声明: 该功能并不影响程序的运行,但是会对编译器警告等辅助工具产生影响 ...