设计模式之组合代理模式
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 “组合对象” 的含义。
代理模式:
组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
例题:
(列出实验内容,阐明实验步骤及中间的结果或现象、最终结果和现象,对这些结果和现象进行分析,若出现误差也予以分析误差原因)
使用组合模式设计一个杀毒软件框架,该软件既可以对一个文件夹杀毒,也可以对一个文件杀毒,文件种类包括文本文件、图片文件、视频文件。绘制类图并编程实现
⑴实验过程:
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();
}
}
实验结果演示:
文章图片
作者:徐敏学
原文链接:点击这里
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息