一,组合模式概述
将对象组合成树状结构以表示 "部分和整体" 层次结构,使得客户可以统一的调用叶子对象和容器对象.
(1)组合模式的使用场景
把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象.
(2)组合模式核心
抽象构件(Component)角色:定义了叶子和容器构件的共同点
叶子(Leaf)构件角色:无子节点
容器(Composite)构件角色:有容器特征,可以包含子节点
/**
* 抽象组件
* @author CL
*
*/
public interface Component {
void operation();
}
/**
* 叶子组件
* @author CL
*
*/
interface Leaf extends Component {
}
/**
* 容器组件
* @author CL
*
*/
interface Composite extends Component {
void add(Component c);
void remove(Component c);
Component getChild(int index);
}
二,组合模式工作流程分析
(1)组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子.
(2)当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员,并调用执行.其中,使用了递归调用的机制对整个结构进行处理.
三,使用组合模式模拟杀毒软件架构设计
import java.util.ArrayList;
import java.util.List;
/**
* 模拟杀毒软软件架构设计
* 抽象组件
* @author CL
*
*/
public interface AbstractFile {
/**
* 杀毒
*/
void killVirus();
}
/**
* 对图片文件进行杀毒
* @author CL
*
*/
class ImageFile implements AbstractFile {
private String name;
public ImageFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("-->对图像文件\""+name+"\"进行查杀!");
}
}
/**
* 对文本文件进行杀毒
* @author CL
*
*/
class TxtFile implements AbstractFile {
private String name;
public TxtFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("-->对文本文件\""+name+"\"进行查杀!");
}
}
/**
* 对视频文件进行杀毒
* @author CL
*
*/
class VideoFile implements AbstractFile {
private String name;
public VideoFile(String name) {
this.name = name;
}
@Override
public void killVirus() {
System.out.println("-->对视频文件\""+name+"\"进行查杀!");
}
}
/**
* 容器组件
* @author CL
*
*/
class Folder implements AbstractFile {
private String name;
//容器:用来存放容器构建下的子节点
private List<AbstractFile> list;
public Folder() {
list = new ArrayList<AbstractFile>();
}
public Folder(String name) {
this();
this.name = name;
}
public void add(AbstractFile file) {
list.add(file);
}
public void remove(AbstractFile file) {
list.remove(file);
}
public AbstractFile getChild(int index) {
return list.get(index);
}
@Override
public void killVirus() {
System.out.println("-->文件夹\""+name+"\"进行查杀!");
for (AbstractFile file : list) {
file.killVirus(); //递归
}
}
}
测试:
/**
* 使用组合模式模拟杀毒软件
* @author CL
*
*/
public class Client {
public static void main(String[] args) {
//1. 将图片和文件加入到文件夹中,对文件夹进行查杀
Folder f1 = new Folder("我的文档");
AbstractFile f2, f3, f4, f5;
f2 = new ImageFile("xaau.jpg");
f3 = new TxtFile("Hello.java");
f1.add(f2);
f1.add(f3);
f1.killVirus();
System.out.println("-----------------------------------");
//2.在文件夹中再加入一个文件夹,其中包含两个视频文件
Folder f11 = new Folder("电影");
f4 = new VideoFile("宝贝计划.avi");
f5 = new VideoFile("泰囧.avi");
f11.add(f4);
f11.add(f5);
f1.add(f11);
//对文件夹进行递归查杀
f1.killVirus();
}
}
控制台输出:
-->文件夹"我的文档"进行查杀!
-->对图像文件"xaau.jpg"进行查杀!
-->对文本文件"Hello.java"进行查杀!
-----------------------------------
-->文件夹"我的文档"进行查杀!
-->对图像文件"xaau.jpg"进行查杀!
-->对文本文件"Hello.java"进行查杀!
-->文件夹"电影"进行查杀!
-->对视频文件"宝贝计划.avi"进行查杀!
-->对视频文件"泰囧.avi"进行查杀!
四,组合模式常用开发应用场景
(1)操作系统的资源管理器;
(2)GUI 的容器层次图;
(3)XML 文件解析;
(4)OA 系统中,组织结构的处理;
(5)Junit 单元测试框架
底层设计就是典型的组合模式,TestCase(叶子),TestUnite(容器),Test(抽象)
(6)............
来源: http://www.bubuko.com/infodetail-2470315.html