设计模式之——Composite模式
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模式的更多相关文章
- 设计模式之Composite模式(笔记)
组合模式:将对象组合成树形结构以表示"部分-总体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 适用场合:当需求中是体现部分与总体层次的结构时,以及希望用户 ...
- 设计模式:composite模式
目的:使容器和内容具备一致性 实现:将对象组合成树形结构以表示“部分-整体”的层次结构 实例:文件夹中可以包含文件夹也可以包含文件 例子: class Item //接口定义 { public: vi ...
- C#设计模式(10)——组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- [设计模式] 8 组合模式 Composite
DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- C#设计模式(10)——组合模式(Composite Pattern)(转)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...
- C++设计模式 之 “数据结构” 模式:Composite、Iterator、Chain of Resposibility
"数据结构"模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用.这时候,将这些特定数据结构封装在内部,在外部提供统一的接口, ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
随机推荐
- 11个超棒的 jQuery 分步指引插件(转)
当一个网站或者一个Web应用推出新功能时,为了让用户了解你的站点(或应用)如何操作,往往都会在站点(应用)中添加一个分步指引的效果.然而这样的效果,对于不懂原生JS的同学来说,是件很头痛的事情. 下面 ...
- eclipse下载,安装,JDk环境配置教程(多图)
第一步:下载eclipse,并安装. 下载链接:http://www.eclipse.org/downloads/ 点击 Download Packages; 根据自己的系统选择32位还是64位的,点 ...
- oracle的loop等循环语句的几个用法小例子[转]
--loop循环用法 (输出1到10) declare v_num number(2) := 0; begin loop v_num := v_num + 1; exit when v_num > ...
- u3d调用c++ dll的DllNotFoundExceion 问题
原文地址:http://blog.csdn.net/boren31/article/details/8778504 问题年年有,今年特别多. 开发环境: Windows XP sp3 Visual ...
- require() 方法讲解
require.config({ paths:{ "jquery":"jquery.min", "underscore":"und ...
- 第四章 Spring.Net 如何管理您的类___对象的初始化方式
在 Spring.Net 中对象初始化的方式分为两种: ① 急切实例化,也就是说 Spring.Net 容器初始化的时候将对象先实例化出来. ② 延迟实例化,也就是说我们在调用 GetObject 方 ...
- python2.0 s12 day8 _ python线程&python进程
1.进程.与线程区别2.cpu运行原理3.python GIL全局解释器锁4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 6.q ...
- 实例:用类来写一个 memcached 启动脚本
[root@localhost ~]$ yum install -y memcached #!/usr/bin/env python #-*- coding:utf-8 -*- import os i ...
- INSTALL_FAILED_INVALID_APK
在项目中无意中把APP只写成了 xxx 没有xxx.xxx.xxx 掉坑里了,找了好久,给大家提不醒
- 《C++ Primer Plus》15.5 类型转换运算符 学习笔记
C++相对C更严格地限制允许的类型转换,并添加4个类型转换运算符,是转换过程更规范:* dynamic_cast:* const_cast:* static_cast:* reinterpret_ca ...