组合模式:
组合模式工作流程分析:
- 组合模式为处理树形结构提供了完美的方案。描述了如何将容器和叶子如何进行递归组合,使得用户在使用时可以一致性的对待容器和叶子
- 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包括这个方法的成员。并且调用执行,其中使用了递归调用的机制对整个结构进行处理。
组合模式核心:
- 抽象构件(component)角色:定义了叶子和容器组件的共同点。
- 叶子(Leaf)构件角色:无子节点
- 容器(Composite)构件角色:有容器特征,可以包含子节点。
组合模式 :::
package cn.fllday.composite;
/**
* 抽象组件
* 这个是一个组合模式的简单小例子。与示例无关
* @author gssznb
*
*/
public interface Component {
void operation();
}
/**
* 叶子组件
* @author gssznb
*
*/
interface Leaf extends Component{
}
interface Composite extends Component{
void add(Component c);
void remove(Component c);
Component getChild();
}
举个例子: 模仿杀毒软件如何递归文件夹和文件的
package cn.fllday.composite;
import java.util.ArrayList;
import java.util.List;
/**
* 抽象构建
* @author gssznb
*
*/
public interface AbstractFile {
void killVirus(); // 杀毒方法
}
class ImgFile implements AbstractFile{
private String name;
public ImgFile(String name) {
super();
this.name = name;
}
@Override
public void killVirus() {
System.out.println("图片杀毒成功!" + name);
}
}
class VedioFile implements AbstractFile{
private String name;
public VedioFile(String name) {
super();
this.name = name;
}
@Override
public void killVirus() {
System.out.println("视频杀毒成功!" + name);
}
}
class FolderFile implements AbstractFile{
private String name;
// 定义容器用来保存子节点
private List<AbstractFile> list = new ArrayList<>();
public FolderFile(String name) {
super();
this.name = name;
}
@Override
public void killVirus() {
System.out.println("查杀文件夹");
for (AbstractFile file : list) {
file.killVirus();
}
}
public void add(AbstractFile file) {
list.add(file);
}
public void remove(AbstractFile file) {
list.remove(file);
}
}
通过Client 来进行调用
package cn.fllday.composite;
/**
* 开发中的应用场景:
* 操作系统中的资源管理器。
* GUI的容器层次图
* XML的文件解析
* OA系统中,组织结构的处理
* Junit的单元测试框架。
* @author gssznb
*
*/
public class Client {
public static void main(String[] args) {
AbstractFile f2,f4,f5,f6;
FolderFile f1 = new FolderFile("我的收藏"),f3;
f2 = new VedioFile("苍老师的唯一.avi");
f3 = new FolderFile("256G种子");
f4 = new ImgFile("苍天.jpg");
f5 = new VedioFile("haha.avi");
f1.add(f2);
f1.add(f5);
f1.add(f3);
f3.add(f4);
f1.killVirus();
}
}
使用组合模式的场景:
把部分和整体的关系用属性结构来表示。从而使客户端可以使用统一的方式处理部分对象和整体对象。
提一个记忆比较深刻的应用。 之前写用户的权限控制的时候。如果用户没有该页面的权限就不给予这个页面的入口。这个应用就可以使用组合的方式,当时没有了解到组合模式。就自己写了一个递归来进行排序。 效果还好。感觉跟这个一比简直太蠢哈哈。
树形结构无限极分类数据结构以及递归函数写法 就是这个了。有兴趣可以看看哈哈