设计模式之——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) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
随机推荐
- php -- 读取文本文件内容
php读取文件内容的三种方法: //**************第一种读取方式***************************** 代码如下: header("content- ...
- MySQl安装全解
这是第二次安装MySql了.第一次安装花了几个小时,理解安装的每一个页面,这次光寻找安装包就找了几个.因此感觉有必要做一次全面的安装笔记.(有点浪费时间了,可是感觉非常值得)本人系统是window7. ...
- Shader开发之三大着色器
固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分. Shader &qu ...
- Unity简介
Unity (也称 nity3D) 是一套包括图形. 声音.物理等功能的游戏引擎,提供了一个强大的关卡编辑器,支持大部分主流 3D 软件格式,使用 C# JavaScript 等高级语言实现脚本功能, ...
- JavaSE(十)之反射
开始接触的时候可能大家都会很模糊到底什么是反射,大家都以为这个东西不重要,其实很重要的,几乎所有的框架都要用到反射,增加灵活度.到了后面几乎动不动就要用到反射. 首先我们先来认识一下对象 学生---- ...
- 支付宝 报错 rsa_private read error : private key is NULL解决方法
原因: 真机调试IOS支付宝功能GDB出现 rsa_private read error : private key is NULL提示 调试iOS 支付宝SDK的时候,执行demo.把 Partn ...
- asp.net mvc forms身份认证
web.config配置 <authentication mode="Forms"> <forms loginUrl="~/Login/Index&qu ...
- app服务端server端数据库设计
- IIS 使用多个https和通配证书解决方案
环境:OS :WINDOWS 2008 IIS: IIS7 域名:三个二级域名 问题:由于一个网站只支持一个443,但可以通过更改配置得到绑定不同域名.但由于公用证书,所以问题出来.只能为一个二级域名 ...
- Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)
集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...