先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”
/**
* 抽象组件
*/
public interface Component {
void operation();
}
/**
* 叶子组件
*/
interface Leaf extends Component{
}
/**
* 容器组件
*/
interface Composite extends Component{
}
public interface AbstractFile {
void killVirus();
}
class ImageFile implements AbstractFile{
private String name;
public ImageFile(String name) {
super();
this.name = name;
}
@Override
public void killVirus() {
System.out.println("图像文件"+name+"进行查杀");
}
}
class TextFile implements AbstractFile{
private String name;
public TextFile(String name) {
super();
this.name = name;
}
@Override
public void killVirus() {
System.out.println("文本文件"+name+"进行查杀");
}
}
class VideoFile implements AbstractFile{
private String name;
public VideoFile(String name) {
super();
this.name = name;
}
@Override
public void killVirus() {
System.out.println("视频文件"+name+"进行查杀");
}
}
class Folder implements AbstractFile{
private String name;
private List<AbstractFile> list = new ArrayList<AbstractFile>();
public Folder(String name) {
super();
this.name = name;
}
public void add(AbstractFile file){
list.add(file);
}
public void remove(AbstractFile file){
list.remove(file);
}
public AbstractFile getChildr(int index){
return list.get(index);
}
@Override
public void killVirus() {
System.out.println("文件夹"+name+"进行查杀");
for(AbstractFile file:list){
file.killVirus();
}
}
}
测试:
public class Client {
public static void main(String[] args) {
AbstractFile f2,f3,f4,f5;
Folder f1 = new Folder("我的收藏");
f2 = new ImageFile("mm.jpg");
f3 = new TextFile("123.txt");
f1.add(f2);
f1.add(f3);
Folder f11 = new Folder("我的电影");
f4 = new VideoFile("笑傲江湖.avi");
f5 = new VideoFile("神雕侠侣.mp4");
f11.add(f4);
f11.add(f5);
f1.add(f11);
f1.killVirus();
}
}什么情况下使用组合模式
引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”
JAVA设计模式(10):结构型-组合模式(Composite)
原文地址:http://blog.csdn.net/lovesomnus/article/details/45197889