composite模式又叫做组合模式/复合模式。

它是一种能够使容器与内容具有一致性,创造出递归结构的模式。

示例程序是列出文件夹以及其内部文件与文件夹一览的功能:

可以由示例图看出,有一个电影文件夹里面有两个文件夹,一个是正常,一个是你懂得。

在正常文件夹里面有三个电影,分别是泰坦尼克号,终结者和钢铁侠。

而在你懂得文件夹里面有两部电影和一个葵司文件夹,两部电影分别是列车.avi和苍老师.avi,而葵司文件里面同样也有两部电影,家庭教师.avi和隔壁小姐姐.avi。

下面是示例代码:

  • SomeThing 文件夹和文件的父类
package site.wangxin520.gof.composite;

/**
* 所有东西的一个父类
* @author wangXgnaw
*
*/
public abstract class SomeThing { //名字
public abstract String getName(); //大小、所占空间
public abstract int getSize(); //输出打印自己,文件的话,就打印里面所有文件,和自己。如果是文件的话,打印自己
public abstract void print();
}
  • Directroy 文件夹类
package site.wangxin520.gof.composite;

import java.util.ArrayList;

/**
* 文件夹的类
* @author wangXgnaw
*
*/
public class Directory extends SomeThing{ private String name;
private int size; private ArrayList<SomeThing> arr; /**
* 文件夹构造函数,传入文件夹名
* @param name
*/
public Directory(String name) {
this.name=name;
arr=new ArrayList<>();
} @Override
public String getName() {
return name;
} @Override
public int getSize() {
size=0;
for (SomeThing someThing : arr) {
size+=someThing.getSize();
}
return size;
} /**
* 递归打印出本文件夹名字和文件夹内部的文件或者文件夹的名字
*/
@Override
public void print() {
System.out.println("文件夹名:"+name+" 大小为:"+getSize());
for (SomeThing someThing : arr) {
someThing.print();
}
} /**
* 文件夹添加东西
* @param someThing 这里的something既可以是文件夹,又可以是文件
*/
public void addSomeThing(SomeThing someThing){
arr.add(someThing);
} }
  • File 文件类
package site.wangxin520.gof.composite;

/**
* 文件类
* @author wangXgnaw
*
*/
public class File extends SomeThing{ private String name;
private int size; public File(String name,int size){
this.name=name;
this.size=size;
} @Override
public String getName() {
return name;
} @Override
public int getSize() {
return size;
} /**
* 打印出本文件名
*/
@Override
public void print() {
System.out.println("文件:"+name+"["+size+"]");
} }
  • Test测试类
package site.wangxin520.gof.composite;

/**
* 组合模式的测试类
* @author wangXgnaw
*
*/
public class Test {
public static void main(String[] args) { Directory moive=new Directory("电影"); Directory normal=new Directory("正常的");
Directory heihei=new Directory("你懂得"); moive.addSomeThing(normal);
moive.addSomeThing(heihei); normal.addSomeThing(new File("终结者.rmvb", 850));
normal.addSomeThing(new File("泰坦尼克号.rmvb", 770));
normal.addSomeThing(new File("钢铁侠.rmvb", 1200)); heihei.addSomeThing(new File("列车.avi", 3200));
Directory kuiSi=new Directory("葵司");
kuiSi.addSomeThing(new File("葵司-家庭老师.avi", 3000));
kuiSi.addSomeThing(new File("葵司-隔壁小姐姐.avi", 3000));
heihei.addSomeThing(new File("苍老师.avi", 1800));
heihei.addSomeThing(kuiSi); moive.print();
}
}
  • 控制台输出结果为:
文件夹名:电影     大小为:13820
文件夹名:正常的 大小为:2820
文件:终结者.rmvb[850]
文件:泰坦尼克号.rmvb[770]
文件:钢铁侠.rmvb[1200]
文件夹名:你懂得 大小为:11000
文件:列车.avi[3200]
文件:苍老师.avi[1800]
文件夹名:葵司 大小为:6000
文件:葵司-家庭老师.avi[3000]
文件:葵司-隔壁小姐姐.avi[3000]

设计模式之——Composite模式的更多相关文章

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

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

  2. 设计模式:composite模式

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

  3. C#设计模式(10)——组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

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

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

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

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

  6. C#设计模式(10)——组合模式(Composite Pattern)(转)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  7. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...

  8. C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility

    "数据结构"模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用.这时候,将这些特定数据结构封装在内部,在外部提供统一的接口, ...

  9. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

随机推荐

  1. 在windows下编译ffmpeg

    编译ffmpeg,我在网上找了很多相关的方法,但最后都没编译成功. 所以下面就记录下自己的编译方法吧,留着以后编译的时候做参考. 1.首先,下载编译工具MinGW+Msys,搭建编译环境.工具下载地址 ...

  2. css -- 通俗理解inline、block、inline-block

    display:inline; 内联元素,简单来说就是在同一行显示. display:block; 块级元素,简单来说就是就是有换行,会换到第二行. display:inline-block; 就是在 ...

  3. Mysql经常使用基本命令汇总及默认账户权限与改动

    一直仅仅是在浅显利用数据库存储数据.也被windows惯坏了.非常多命令使用的时候记不起来.so,换LINUX系统!不再使用GUI管理数据库!也想深入学习下Mysql.从权限管理開始.也就诞生了这篇学 ...

  4. 常用Javascript函数与原型功能收藏

    // 重复字符串 String.prototype.repeat = function(n) { return new Array(n+1).join(this); } // 替换全部 String. ...

  5. sublime text 删除插件

    1.ctrl+shift+p 输入remove package 选择要删掉的插件即可 2.去掉产生临死文件的插件:phptools

  6. How many virtual users do I need? 计算需要的vuser

    基本公式:--------English:Total Transations = TPS * Vuser==>Vuser = Total Transations / TPS=========== ...

  7. 使用 JMeter 完成常用的压力测试 [转]

    讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...

  8. plsql developer中,清除登录历史

    需求描述: 在使用plsql developer的时候,发现登录的时候,有太多的历史,想要把这些登录历史清除掉, 在此记录下. 操作过程: 1.登录plsql developer(或者在登录时取消也会 ...

  9. Oracle中的三种循环(For、While、Loop)

    from:http://jingyan.baidu.com/article/c275f6ba38036ae33c756773.html GOTO用法,以下是SQL源码: DECLARE  x numb ...

  10. TCP处理主要开销

    快速的网络TCP 通常受限 发送主机 与 接收主机. 而不是网络设备或协议本身的实现. TCP的处理的主要开销 分为中断操作.数据复制和协议处理. 1:中断操作 2:数据复制 3:协议处理 TCP的处 ...