组合模式又叫树模式,是一个应用比较广泛的设计模式,
数据结构中我们学过树这一个概念,组合模式类似于树的概念,枝干代表整体,树叶和分支代表部分。
组合模式通常应用在表示二叉树,多叉树等树形结构的数据集合。
我们通过一个简单的window目录来简讲解组合模式
组合模式的元素:
1.Component (抽象构建角色)是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component。
2.Leaf (树叶节点角色)在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite (树枝构建角色)定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除。
Component
/**
*
*/
package com.model.composite;
import java.util.List;
/**
***************************************************************
* 项目名称:DescignModel
* 程序名称:Root
* 日期:2012-9-5 下午02:14:00
* 作者:
* 模块:
* 描述:抽象角色
* 备注:
* ------------------------------------------------------------
* 修改历史
* 序号 日期 修改人 修改原因
*
* 修改备注:
* @version
***************************************************************
*/
public interface Root {
public boolean addFile(Root file);
public boolean removeFile(Root flie);
public List<Root> getFile();
public void display();
}
Leaf
/**
*
*/
package com.model.composite;
import java.util.List;
/**
***************************************************************
* 项目名称:DescignModel
* 程序名称:File
* 日期:2012-9-5 下午02:17:51
* 作者:
* 模块:
* 描述:叶子角色
* 备注:
* ------------------------------------------------------------
* 修改历史
* 序号 日期 修改人 修改原因
*
* 修改备注:
* @version
***************************************************************
*/
public class File implements Root {
private String name;
public File(String name){
this.name = name;
}
/* (non-Javadoc)
* @see com.model.composite.Root#addFile(com.model.composite.Root)
*/
@Override
public boolean addFile(Root file) {
//本身就是文件无法添加
return false;
}
/* (non-Javadoc)
* @see com.model.composite.Root#removeFile(com.model.composite.Root)
*/
@Override
public boolean removeFile(Root flie) {
//同上方法只有在文件夹对象才实现
return false;
}
/* (non-Javadoc)
* @see com.model.composite.Root#getFile()
*/
@Override
public List<Root> getFile() {
return null;
}
/* (non-Javadoc)
* @see com.model.composite.Root#display()
*/
@Override
public void display() {
System.out.println(" |_____"+this.name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Composite
/**
*
*/
package com.model.composite;
import java.util.ArrayList;
import java.util.List;
/**
***************************************************************
* 项目名称:DescignModel 程序名称:Folder 日期:2012-9-5 下午02:21:55 作者: 模块: 描述:枝干接点 备注:
* ------------------------------------------------------------ 修改历史 序号 日期 修改人
* 修改原因
*
* 修改备注:
*
* @version
***************************************************************
*/
public class Folder implements Root {
private String name;
private List<Root> folderNode;
public Folder(String name) {
this.name = name;
folderNode = new ArrayList<Root>();
}
/*
* (non-Javadoc)
*
* @see com.model.composite.Root#addFile(com.model.composite.Root)
*/
@Override
public boolean addFile(Root file) {
try {
folderNode.add(file);
} catch (Exception e) {
return false;
}
return true;
}
/*
* (non-Javadoc)
*
* @see com.model.composite.Root#removeFile(com.model.composite.Root)
*/
@Override
public boolean removeFile(Root flie) {
try {
folderNode.remove(flie);
} catch (Exception e) {
return false;
}
return true;
}
/*
* (non-Javadoc)
*
* @see com.model.composite.Root#getFile()
*/
@Override
public List<Root> getFile() {
return folderNode;
}
/*
* (non-Javadoc)
*
* @see com.model.composite.Root#display()
*/
@Override
public void display() {
System.out.println(name);
for (Root f : folderNode) {
if (f instanceof Folder) {
System.out.print("|__");
}
f.display();
}
}
}