组合模式
用面向对象的方式来处理树形结构
组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。
在组合模式中引入了抽象构件类Component,它是所有容器类和叶子类的公共父类。
角色
Component抽象构件
可以是接口或抽象类
为叶子构件和容器构件对象声明接口
Leaf叶子构件
叶子节点没有子节点
Composite容器构件
容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。

杀毒软件案例

1.抽象文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
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();
}

2.Image文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public 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 + "'进行杀毒----"); } }

3.文本文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public class TextFile extends AbstractFile{
private String name;
public TextFile (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 + "'进行杀毒----"); } }

4.视频文件类

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public class VideoFile extends AbstractFile{
private String name;
public VideoFile (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 + "'进行杀毒----"); } }

5.文件夹类

package Composite;

import java.util.ArrayList;

/**
* Created by Jiqing on 2016/10/5.
*/
public class Folder extends 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 + "'进行杀毒****"); // 模拟杀毒
// 递归调用成员构件的杀毒方法
for (Object obj :fileList) {
((AbstractFile)obj).killVirus();
}
}
}

6.客户端

package Composite;

/**
* Created by Jiqing on 2016/10/5.
*/
public class Client {
public static void main(String args[]) {
AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
folder1 = new Folder("Jim的资料");
folder2 = new Folder("图像文件");
folder3 = new Folder("文本文件");
folder4 = new Folder("视频文件"); file1 = new ImageFile("小龙女.jpg");
file2 = new ImageFile("张无忌.gif");
file3 = new TextFile("九阴真经.txt");
file4 = new TextFile("葵花宝典.doc");
file5 = new VideoFile("笑傲江湖.rmvb"); folder2.add(file1);
folder2.add(file2);
folder3.add(file3);
folder3.add(file4);
folder4.add(file5);
folder1.add(folder2);
folder1.add(folder3);
folder1.add(folder4); folder1.killVirus();
}
}

执行结果

对文件夹'Jim的资料'进行杀毒

对文件夹'图像文件'进行杀毒

----对图像文件'小龙女.jpg'进行杀毒----

----对图像文件'张无忌.gif'进行杀毒----

对文件夹'文本文件'进行杀毒

----对文本文件'九阴真经.txt'进行杀毒----

----对文本文件'葵花宝典.doc'进行杀毒----

对文件夹'视频文件'进行杀毒

----对视频文件'笑傲江湖.rmvb'进行杀毒----

JAVA设计模式之【组合模式】的更多相关文章

  1. java设计模式之组合模式

    组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...

  2. Java设计模式应用——组合模式

    组合模式实际上是一种树形数据结构.以windows目录系统举例,怎么样用java语言描述一个文件夹? 定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类. 进一步抽象,把文件夹和文件都看做节 ...

  3. java设计模式5.组合模式、门面模式、享元模式、桥接模式

    组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...

  4. JAVA设计模式之组合模式(composite)

    组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...

  5. 老和尚给小和尚讲故事引发了Java设计模式:组合模式

    目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...

  6. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  7. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  8. 折腾Java设计模式之访问者模式

    博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...

  9. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  10. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

随机推荐

  1. ”危险“的RESTRICT与GCC的编译优化(编程者对编译器所做的一个“承诺”:使用restrict修饰过的指针,它所指向的内容只能经由该指针修改)

    restrict是C99标准中新添加的关键字,对于从C89标准开始起步学习C语言的同学来说(包括我),第一次看到restrict还是相当陌生的.Wikipedia给出的解释如下: In the C p ...

  2. 由mitab学到一些关于编译和运行的理解

    今天上午在鼓捣一个地图绘图程序,程序写到一半,在windows下写不下去了,原因是需要引入的第三方的mitab类库进行.mif文件的读写操作,而这个类库的windows下的.lib文件和.dll文件都 ...

  3. RTSP/RTP 媒体传输和控制协议

    1 前言 本文档主要描述了 NewStream Vision 系统中前端视频服务器(DVR, 网络摄像机), 中心转发服务器以及客户端之间的多媒体通信以及控制协议. 本协议主要基于标准的 IETE 的 ...

  4. HD-ACM算法专攻系列(22)——Max Sum

    问题描述: AC源码: 此题考察动态规划,解题思路:遍历(但有技巧),在于当前i各之和为负数时,直接选择以第i+1个为开头,在于当前i各之和为正数时,第i个可以不用作为开头(因为前i+1个之和一定大于 ...

  5. Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)

    1. Dump文件的用途 Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态.  除了平时常见的attach到这个进程, 分 ...

  6. vue强制绑定css3的缩放效果transfrom:scale()

    vue不提供 transfrom:scale(1.5) : 会报错 ,错误是  "TypeError: _vm.scale is not a function": 原因:Vue将其 ...

  7. onTouchEvent事件

    @Override public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTIO ...

  8. spring MVC +freemarker + easyui 实现sql查询和执行小工具总结

    项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍 ...

  9. 电子邮件的三个协议: SMTP、IMAP、POP3

    个人总结: 读完这篇文章需要10分钟 讲解了跟电子邮件有关的三个协议: SMTP(simple message transfer protocol 简单信息传输协议 IMAP (internet me ...

  10. node 常用命令行

    安装模块命令 npm install moduleName –save npm install moduleName npm install npm start express创建项目目录 expre ...