设计模式:组合(Composite)模式
设计模式:组合(Composite)模式
一、前言
关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序的,肯定少不了定义一些组件,初始化之后,然后使用容器的add方法,将这些组件有顺序的组织成一个界面出来;或者读者如果编写过前端的页面,肯定使用过<div>等标签定义一些格式,然后格式之间互相组合,通过一种递归的方式组织成相应的结构,这种方式其实就是组合,将部分的组件镶嵌到整体之中;又或者文件和文件夹的组织关系,通过目录表项作为共同的特质(父类),一个文件夹可以包含多个文件夹和多个文件,一个文件容纳在一个文件夹之中。那么凭什么可以这样做呢,需要满足以下两点,首先整体的结构应该是一棵树,第二,所有的组件应该有一个共同的父类(有共同的本质),这个父类使得组件中的共同的本质可以提取出来(有了共同语言(父类)),进行互融,其实就是父类使用add方法,这样子类就可以通过抽象的方式通过父类来表达了,可能有点绕口,让我们看一个例子。

二、代码
Entry 抽象类:共同特质
package zyr.dp.composite;
public abstract class Entry {
public abstract String getName();
public abstract int getSize();
public abstract void printList(String prefix);
public void printList(){
printList("");
}
public Entry add(Entry entry) throws RuntimeException{
throw new RuntimeException();
}
public String toString(){
return getName()+"<"+getSize()+">";
}
}
File 类:实现类,叶子结点
package zyr.dp.composite;
public class File extends Entry {
private String name;
private int size;
public File(String name,int size){
this.name=name;
this.size=size;
}
public String getName() {
return name;
}
public int getSize() {
return size;
}
public void printList(String prefix) {
System.out.println(prefix+"/"+this);
}
}
Directory 类:可扩充节点(中间节点)
package zyr.dp.composite; import java.util.ArrayList;
import java.util.Iterator; public class Directory extends Entry { String name;
ArrayList entrys=new ArrayList();
public Directory(String name){
this.name=name;
}
public String getName() {
return name;
} public int getSize() {
int size=0;
Iterator it=entrys.iterator();
while(it.hasNext()){
size+=((Entry)it.next()).getSize();
}
return size;
} public Entry add(Entry entry) {
entrys.add(entry);
return this;
} public void printList(String prefix) {
System.out.println(prefix+"/"+this);
Iterator it=entrys.iterator();
Entry entry;
while(it.hasNext()){
entry=(Entry)it.next();
entry.printList(prefix+"/"+name);
}
} }
Main类:组合组件
package zyr.dp.composite;
public class Main {
public static void main(String[] args) {
Directory root=new Directory("根目录");
Directory life=new Directory("我的生活");
File eat=new File("吃火锅",100);
File sleep=new File("睡觉",100);
File study=new File("学习",100);
life.add(eat);
life.add(sleep);
life.add(study);
Directory work=new Directory("我的工作");
File write=new File("写博客",200);
File paper=new File("写论文",200);
File homework=new File("写家庭作业",200);
work.add(write);
work.add(paper);
work.add(homework);
Directory relax=new Directory("我的休闲");
File music=new File("听听音乐",200);
File walk=new File("出去转转",200);
relax.add(music);
relax.add(walk);
Directory read=new Directory("我的阅读");
File book=new File("学习书籍",200);
File novel=new File("娱乐小说",200);
read.add(book);
read.add(novel);
root.add(life);
root.add(work);
root.add(relax);
root.add(read);
root.printList("D:");
System.out.println("=================");
work.printList("work");
System.out.println("=================");
novel.printList("novel");
}
}
运行结果:

三、总结
由此可见,我们以前使用的“容器+内容”,其实是通过组合模式实现的,组合模式保证了容器和内容的一致性,容器里面可以套容器,也可以放内容,但是内容已经是叶子结点了,不能继续扩充,还记得我们在抽象工厂方式中使用的模式之中,为了将零件组装成产品,我们就使用了组合模式,非常的有意思,通过递归来遍历所有的内容。组合模式在我们的生活中使用的非常普遍,我们一定要使用好这个模式,理解其中的抽象,特别是add()的定义,抽象类和实现类之间的参数传递,这点至关重要,当然我们又使用了模板方法和迭代器,希望大家能明白模式之间的联系以及相互使用的道理。
设计模式:组合(Composite)模式的更多相关文章
- Java 实现组合(Composite)模式
类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...
- 设计模式之——Composite模式
composite模式又叫做组合模式/复合模式. 它是一种能够使容器与内容具有一致性,创造出递归结构的模式. 示例程序是列出文件夹以及其内部文件与文件夹一览的功能: 可以由示例图看出,有一个电影文件夹 ...
- C++设计模式实现--组合(Composite)模式
一. 举例 这个样例是书上的,如果有一个公司的组结结构例如以下: 它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点. 并且最关健的是,它的每一层结构非常相似. 代码实现例 ...
- 设计模式C++描述----11.组合(Composite)模式
一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...
- Head First 设计模式 —— 11. 组合 (Composite) 模式
思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...
- 设计模式之Composite模式(笔记)
组合模式:将对象组合成树形结构以表示"部分-总体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 适用场合:当需求中是体现部分与总体层次的结构时,以及希望用户 ...
- 组合(composite)模式
定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象.组 ...
- 八、结构模式之组合(Composite)模式
组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...
- 设计模式:composite模式
目的:使容器和内容具备一致性 实现:将对象组合成树形结构以表示“部分-整体”的层次结构 实例:文件夹中可以包含文件夹也可以包含文件 例子: class Item //接口定义 { public: vi ...
- php 设计模式 --组合器模式
PHP 开启错误显示并设置错误报告级别 ini_set('error_reporting', E_ALL); ini_set('display_errors', 'on'); 目的:分级处理:整体 ...
随机推荐
- gRPC GoLang Test
gRPC是Google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +. gRPC与thrift.avro-rpc.WCF等其实在总体 ...
- JMeter元件的作用域与执行顺序
元件的作用域 先来讨论一下元件有作用域.<JMeter基础元件介绍>一节中,我们介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器 是典型的不与其它元件发生交互作用 ...
- IE11在使用get方式提交没有进行请求的bug问题
在做iemsc项目的时候,测试提交了一个bug问题,在发布新闻成功后,自动刷新列表的时候,不进行刷新,但是在谷歌上面又不会出现这种问题, 原因: 发现请求的时候用的get请求,因为不同的浏览器的请求机 ...
- 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作
第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...
- Bash实践:抽样检测数据迁移至Redis集群后的数据一致性
熟悉了一段时间的Bash编程,因此借此任务操作一把bash编程,主要涉及到Redis单节点与Redis集群的操作 1. 任务背景 近日有个任务需要将历史的Redis(主从节点)中的数据迁移至Redis ...
- python 正则表达式应用——缩写词扩充
看具体示例 import re def expand_abbr(sen, abbr): lenabbr = len(abbr) ma = '' for i in range(0, lenabbr): ...
- codeforces 675 C ——Money Transfers——————【思维题】
Money Transfers time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- log4j 详细讲解
日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在apache网站:jakarta.apache.org/log4j 可以免费下载到Log ...
- SQL update 多表连接方法
SQL Update多表联合更新的方法 () sqlite 多表更新方法 //---------------------------------- update t1 set col1=t2.col1 ...
- JS实现中英文混合文字溢出友好截取功能
在显示字符串的时候,避免字符串过长往往会对字符串进行截取操作,通常会用到js的 substr 或者 substring方法, 以及 字符串的length属性 substr() 方法可在字符串中抽取从 ...