设计模式之——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) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
随机推荐
- linux -- Ubuntu Server 安装图形界面
1.连接网络,你一定要确保网络通畅,如果你和我一样使用Wireless,那先找根网线插上,因为下面的安装都要通过网络下载组件的. 2.进入图形界面的命令是startX,敲击后会有安装xinit的提示. ...
- PyQT中多重继承,其中继承的父类有QObject或QObject的子孙类
如果Child多重继承(Parent_1,Parent_2,Parent_3),其super函数 super(Child, self).__init__() 则会执行继承的最左侧的父类:Parent_ ...
- CentOS7设置开机自启动命令大全
任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服务不自 ...
- 使用ADO实现BLOB数据的存取 -- ADO开发实践之二
使用ADO实现BLOB数据的存取 -- ADO开发实践之二 http://www.360doc.com/content/11/0113/16/4780948_86256633.shtml 一.前言 在 ...
- vs中 main和_tmain的区别
用过C的人都知道每一个C的程序都会有一个main(),但有时看别人写的程序发现主函数不是int main(),而是int _tmain(),而且头文件也不是<iostream.h>而是&l ...
- mybatis由浅入深day02_9逆向工程
9 逆向工程 9.1 什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mappe ...
- Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)
IO流 用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中 按操作数据分为:字节流和字符流:按流向分为:输入流和输出流. 程序从输入流中读取数据,向输 ...
- ActiveMQ内存配置和密码设置
1.配置内存 bin中activemq.bat 中的第一行 加上 : REM 配置内存 set ACTIVEMQ_OPTS=-Xms1G -Xmx1G 2.修改控制台密码 1.打开conf/jetty ...
- Serlvet学习笔记之二—不同页面共享数据
一共有四种方法实现共享页面共享数据 1.cookie 2.sendRedirect 3.session 4.隐藏表单提交(form) 5.ServletContex 1.cookie:服务器在客户端保 ...
- apache MINA之心跳协议运用
摘要 心跳协议,对基于CS模式的系统开发来说是一种比较常见与有效的连接检测方式,最近在用MINA框架,原本自己写了一个心跳协议实现,后来突然发现MINA本身带有这样一个心跳实现,感于对框架的小小崇拜, ...