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

浙公网安备 33010602011771号