设计模式之组合模式(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