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. R语言低级绘图函数-abline

    abline 函数的作用是在一张图表上添加直线, 可以是一条斜线,通过x或y轴的交点和斜率来确定位置:也可以是一条水平或者垂直的线,只需要指定与x轴或y轴交点的位置就可以了 常见用法: 1)添加直线 ...

  2. Linux(Ubuntu)下搭建ASP.NET Core环境

    今天来学习一下ASP.NET Core 运行在Ubuntu中.无需安装mono . 环境 Ubuntu 14.04.4 LTS 服务器版 全新安装系统. 下载地址:http://mirrors.neu ...

  3. mybatis传递Map和List集合示例

    1.List示例 java文件: dao: public List<ServicePort> selectByIps(List<String> ips); xml文件: < ...

  4. BaiduMap 鼠标绘制矩形选框四个顶角坐标的获取

    雪影工作室版权全部.转载请注明[http://blog.csdn.net/lina791211] 1.博文产生原因 在使用百度Map开放API进行开发的时候,遇到了一个需求,非常easy的一个需求. ...

  5. BZOJ 1089 SCOI2003 严格n元树 动态规划+高精度

    题目大意:定义一棵深度为d的严格n元树为根的深度为0,最深的节点深度为d,且每一个非叶节点都有恰好n个子节点的树 给定n和d,求深度为d的严格n元树一共同拥有多少种 此题的递推部分并不难 首先我们设深 ...

  6. iOS根据文字字数动态确定Label宽高

    我们有时候在写项目的时候,会碰到,意见反馈,还有其他地方,讲座活动细则等需要大篇展示的文本, 因为每次服务器返回的内容大小不一,所以需要动态的调整label的宽高: 在ios 6 的时候可以: -(v ...

  7. centos无法联网解决方法

    1)进入 /etc/sysconfig/network-scripts/ 2)vi 或 vim 打开 ifcfg-eth0(不一定是eth0,这个自己判断了) 3)将 ONBOOT=no 改成 ONB ...

  8. Java语言基本数据类型

    ■Java是一种强类型语言,每个变量都必须声明其类型.■Java的数据类型分为两大类:基本类型和引用类型(引用数据类型的大小统一为4个字节,记录的是其引用对象的地址).■Java中定义了3类8种基本数 ...

  9. printf如何输出64位整数

    From: http://blog.csdn.net/zzqhost/article/details/6064886 关于printf函数输出64位数的问题,其实在window下和linux下是不一样 ...

  10. Android英文文档翻译系列(5)——VPNService

      API14位于android.net.VpnService 类概述|Class OverviewVpnService is a base class for applications to ext ...