博客> 设计模式之组合模式(Composite)
设计模式之组合模式(Composite)
2017-12-10 08:22 评论:0 阅读:987 vokie
叙述

组合模式个人理解:

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

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

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

[java] view plain copy 在CODE上查看代码片派生到我的代码片 public interface FileInterface {

public void addFile(FileInterface f);  

public void removeFile(FileInterface f);  

public void copyFile();  

}

[java] view plain copy 在CODE上查看代码片派生到我的代码片 import java.util.ArrayList;

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

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);  
}  

}

[java] view plain copy 在CODE上查看代码片派生到我的代码片 //叶子文件夹不能再添加子文件夹
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("叶子文件夹下没有更多的子文件夹");  

}  

}

[java] view plain copy 在CODE上查看代码片派生到我的代码片 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();  

}  

}
这时候的文件结构如下:

程序运行结果:

[java] view plain copy 在CODE上查看代码片派生到我的代码片 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)方法里面的遍历迭代操作。

收藏
0
sina weixin mail 回到顶部