网站首页 > 精选教程 正文
一、概述
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构:
在面向对象设计时,我们经常遇到一类具有容器特征的对象,它们充当着普通对象的同时,还充当着其它对象的容器,这些对象称为容器对象,而那些只能充当普通对象的对象则称为叶子对象。在容器中既可以包含叶子对象,也可以包含容器对象。例如,在树形目录结构中,包含文件和文件夹两类不同的元素:
1、在文件夹中可以包含文件,还可以继续包含子文件夹
2、在文件中不能再包含子文件或者子文件夹
那么文件夹对象为容器(Container)对象,则文件对象为叶子(Leaf)对象。
当容器对象的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理。
由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使程序非常复杂。
二、组合模式的定义
如何一致地对待容器对象和叶子对象?我们学个新的模式:组合模式。
组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对它们进行区分,可以一致地对待容器对象和叶子对象。
组合模式:组合多个对象形成树形结构以表示具有部分和整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。Composite Pattern: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
Component(抽象构件)
Leaf(叶子构件)
Composite(容器构件)
public abstract class Component {
public abstract void add(Component c); //增加成员
public abstract void remove(Component c); //删除成员
public abstract Component getChild(int i); //获取成员
public abstract void operation(); //业务方法
}
public class Leaf extends Component {
public void add(Component c) {
//异常处理或错误提示
}
public void remove(Component c) {
//异常处理或错误提示
}
public Component getChild(int i) {
//异常处理或错误提示
return null;
}
public void operation() {
//叶子构件具体业务方法的实现
}
}
public class Composite extends Component {
private ArrayList<Component> list = new ArrayList<Component>();
public void add(Component c) {
list.add(c);
}
public void remove(Component c) {
list.remove(c);
}
public Component getChild(int i) {
return (Component)list.get(i);
}
public void operation() {
//容器构件具体业务方法的实现,将递归调用成员构件的业务方法
for(Object obj:list) {
((Component)obj).operation();
}
}
}
三、案例
某软件公司欲开发一个杀毒(Antivirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。现使用组合模式来设计该杀毒软件的整体框架。
package com.test;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
//针对抽象构件编程
AbstractFile file1,file2, folder ;
folder = new Folder("图像文件");
file1 = new ImageFile("上官婉儿.jpg");
file2 = new ImageFile("王昭君.gif");
folder .add(file1);
folder .add(file2);
folder.killVirus();
}
}
abstract class AbstractFile {
public abstract void add(AbstractFile file);
public abstract void remove(AbstractFile file);
public abstract AbstractFile getChild(int i);
public abstract void killVirus();
}
class Folder extends AbstractFile {
//定义集合fileList,用于存储AbstractFile类型的成员
private ArrayList<AbstractFile> fileList=new ArrayList<AbstractFile>();
private String name;
public Folder(String name) {
this.name = name;
}
public void add(AbstractFile file) {
fileList.add(file);
}
public void remove(AbstractFile file) {
fileList.remove(file);
}
public AbstractFile getChild(int i) {
return (AbstractFile)fileList.get(i);
}
public void killVirus() {
System.out.println("****对文件夹'" + name + "'进行杀毒"); //模拟杀毒
//递归调用成员构件的killVirus()方法
for(Object obj : fileList) {
((AbstractFile)obj).killVirus();
}
}
}
class ImageFile extends AbstractFile {
private String name;
public ImageFile(String name) {
this.name = name;
}
public void add(AbstractFile file) {
System.out.println("对不起,不支持该方法!");
}
public void remove(AbstractFile file) {
System.out.println("对不起,不支持该方法!");
}
public AbstractFile getChild(int i) {
System.out.println("对不起,不支持该方法!");
return null;
}
public void killVirus() {
//模拟杀毒
System.out.println("----对图像文件'" + name + "'进行杀毒");
}
}
//TextFile和VideoFile和上述类似,略
运行结果:
本资料案例主要学习 《Java设计模式 中南大学 刘伟》之后总结,其中程序读者亲自在myEclipse8.5版本调试通过,注意本人所有的类和接口写在一个Java文件里面,除了主类其它类和接口不能声明为public的,主要是提醒出道时间不长的读者,以免造成学习上的麻烦,但重在多试,有问题是好事。
组合模式使用的场景:
1、在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们
2、在一个使用面向对象语言开发的系统中需要处理一个树形结构
3、在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型
- 上一篇: 趣谈 23 种设计模式(多图 + 代码)
- 下一篇: 面试官问:SOA架构和微服务架构的区别是什么?
猜你喜欢
- 2024-12-05 趣谈 23 种设计模式(多图 + 代码)
- 2024-12-05 别错过了!牛人大神开始讲解java和设计模式(行为模式)
- 2024-12-05 你知道吗?Spring中都用到了那些设计模式?面试的时候慌了吗?
- 2024-12-05 Spring框架中都用到了哪些设计模式?
- 2024-12-05 Java中的设计模式(一):观察者模式
- 2024-12-05 Java设计模式——装饰者设计模式
- 2024-12-05 9种设计模式在Spring中的运用,一定要非常熟练
- 2024-12-05 对java设计模式的理解、总结
- 2024-12-05 一文总结Java的23种设计模式
- 2024-12-05 java设计模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)