设计模式之组合代理模式

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

}
实验结果演示:
这里写图片描述
作者:徐敏学
原文链接:点击这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值