设计模式之组合代理模式

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 “组合对象” 的含义。
代理模式:
组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
例题:
(列出实验内容,阐明实验步骤及中间的结果或现象、最终结果和现象,对这些结果和现象进行分析,若出现误差也予以分析误差原因)
使用组合模式设计一个杀毒软件框架,该软件既可以对一个文件夹杀毒,也可以对一个文件杀毒,文件种类包括文本文件、图片文件、视频文件。绘制类图并编程实现
⑴实验过程:
1、构建实现场景,画出UML类图
2丶实现代码,见演示源码
画出UML类图:
设计模式之组合代理模式
文章图片

代码如下:
AbstractFile.java
package exercise9;
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();
}
ImageFile.java
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.java
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 + "'进行杀毒"); } }

VideoFile.java
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 + "'进行杀毒"); } }

Folder.java
import java.util.ArrayList;
class Folder extends AbstractFile { //文件夹类:容器构件
//定义集合fileList,用于存储AbstractFile类型的成员
private ArrayList fileList=new ArrayList();
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(); }

}
}
Client.java
class Client { //客户端类
public static void main(String args[]) {
//针对抽象构件编程
AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
folder1 = new Folder("minxue的资料"); folder2 = new Folder("图像文件"); folder3 = new Folder("文本文件"); folder4 = new Folder("视频文件"); file1 = new ImageFile("图书馆.jpg"); file2 = new ImageFile("林梦航.gif"); file3 = new TextFile("数据库.txt"); file4 = new TextFile("实验9.doc"); file5 = new VideoFile("战狼2.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); //从“minxue的资料”节点开始进行杀毒操作 folder1.killVirus(); }

}
实验结果演示:
设计模式之组合代理模式
文章图片

作者:徐敏学
原文链接:点击这里

    推荐阅读