设计模式之组合模式(Composite)

组合模式个人理解:

首先确定它的结构是一个树形,用生活中的比方来说:一个公司的总经理下面有很多副经理,副经理下面有很多秘书。这就是一个树形结构,作为总经理,可以管理手下的所有副经理和秘书,而副经理只能管理手下拥有的那些秘书,他不能管理不归他管理的秘书。这就是组合模式应用的点,对整体(总经理)的操作,影响下属的所有受管理的对象,而对部分(副经理)的操作,不会影响到总经理。这种设计模式的微妙确实很多,对外界来说,我可以更有层次的管理。至于其它优点,可以自己琢磨,网上也有人总结了这种模式的优点,不过都是有点太死板,不够实例化,比如:将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

这里我的案例是文件夹的拷贝案例,文件夹以树形结构进行管理,然后进行拷贝工作。拷贝根文件夹会影响其下面的所有子文件夹,拷贝子文件夹,也会影响该子文件夹下面的所有文件夹(但不影响其父文件夹)先贴代码:

FileInterface作为抽象接口,必须要实现addFile,removeFile子节点的方法以及访问这些子节点的方法copyFile()

public interface FileInterface {

	public void addFile(FileInterface f);

	public void removeFile(FileInterface f);

	public void copyFile();

}

 

import java.util.ArrayList;

public class RootFile implements FileInterface {
	String fileName;
	public ArrayList<FileInterface> list = new ArrayList<FileInterface>();

	public RootFile(String name) {
		fileName = name;
	}

	@Override
	public void addFile(FileInterface f) {
		list.add(f);

	}

	@Override
	public void copyFile() {
		System.out.println("Copy " + fileName);
		for (FileInterface f : list) {
			f.copyFile();
		}

	}

	@Override
	public void removeFile(FileInterface f) {
		list.remove(f);
	}

}

 

//叶子文件夹不能再添加子文件夹
public class LeafFile implements FileInterface {
	String fileName;

	public LeafFile(String name) {
		fileName = name;
	}

	@Override
	public void addFile(FileInterface f) {
		System.out.println("叶子文件夹无法继续添加子文件夹");
	}

	@Override
	public void copyFile() {
		System.out.println("Copy " + fileName);

	}

	@Override
	public void removeFile(FileInterface f) {
		System.out.println("叶子文件夹下没有更多的子文件夹");

	}

}

 

public class Main {
	public static void main(String[] args) {
		FileInterface root = new RootFile("Root");
		FileInterface fa = new RootFile("A");
		FileInterface fb = new RootFile("B");
		FileInterface fa1 = new RootFile("A-1");
		FileInterface fa2 = new RootFile("A-2");
		FileInterface fa21 = new LeafFile("A-2-1");
		FileInterface fa22 = new LeafFile("A-2-2");
		FileInterface fa23 = new LeafFile("A-2-3");

		root.addFile(fa);
		root.addFile(fb);
		fa.addFile(fa1);
		fa.addFile(fa2);
		fa2.addFile(fa21);
		fa2.addFile(fa22);
		fa2.addFile(fa23);

		fa.copyFile();
		System.out.println("====================分割线=======================");
		//从fa2文件夹中删除子文件夹fa22
		fa2.removeFile(fa22);
		root.copyFile();

	}
}

这时候的文件结构如下:


程序运行结果:

Copy A
Copy A-1
Copy A-2
Copy A-2-1
Copy A-2-2
Copy A-2-3
====================分割线=======================
Copy Root
Copy A
Copy A-1
Copy A-2
Copy A-2-1
Copy A-2-3
Copy B


感觉有点想秦始皇时期的中央集权制的感觉。。。至此,组合模式的使用与学习也就感觉差不多了。

总结:需要注意的点,首先有一个抽象的FileInterface来抽象出其所有子类,并留下共有的操作接口,add,remove,visit(我这里是copyFile)方法,然后是构建树形结构,需要使用的ArrayList来保存我们的子节点。还有就是visit(我这里是copyFile)方法里面的遍历迭代操作。

项目源代码地址:http://www.kuaipan.cn/file/id_132802506211221451.htm?source=1


 

posted @ 2013-12-27 10:30  Mr轨迹  阅读(242)  评论(0编辑  收藏  举报