对层级数据递归调用执行操作。先说一下这个组合模式是composite,然后说一个场景,这个模式然后按照一个什么场景来做呢,举个例子,有一颗部门树,然后父部门有这个子部门,然后又有子部门,这样的一颗部门树,然后的话呢,我们要对这个部门树,然后删除它所有的这个,删除一个父部门以及其下所有的子部门,我们要执行这样的一个事情啊,然后的话呢,先看一下,它的这个,如果不用模式的话怎么玩,WithoutCompositePatternDemo,这个不用模式的话,其实就不是很好玩了,它这个是public static class Department{ private String name; private List<Department> children = new ArrayList<Department>(); },这样,然后我们这边给它搞一对get,和set方法,然后main方法,这个department的话呢,比如我们先给它搞一个,
Department leafDept1 = new Department("叶子部门1");
Department leafDept2 = new Department("叶子部门2");
Department leafDept3 = new Department("叶子部门3");
Department subDept1 = new Department("子部门1");
Department subDept2 = new Department("子部门2");
subDept1.getChildren().add(leafDept1);
subDept1.getChildren().add(leafDept2);
subDept2.getChildren().add(leafDept3);
Department parentDept = new Department("父部门");
parentDept.getChildren().add(subDept1);
parentDept.getChildren().add(subDept2);
好,那这样的话,其实我们就组织好了一个树形结构,就是这个父部门,是子部门1和子部门2它们俩,然后子部门1是叶子部门1和叶子部门2,然后子部门2的这个是叶子部门3,就是这样的一个树形这么的结构,好,现在我们假设说要把这个,这个父部门及其它下面的所有的子部门和叶子部门,都给它删了,这个时候,我怎么来做,这个时候,就比较恶心了,它可能是这昂的,再假设我给它们每个人一个方法,public void remove(){ System.out.println("删除部门【" + name + "】");},我们可能要这样来写,应该这样子的,就是我们先那个
for(Department subDept : parentDept.getChildren()){
if(subDept.getChildren().size() >0){
for(Department leafDept : subDept.getChildren()){
leafDept.remove();
}
}
subDept.remove();
}
parentDept.remove();
先拿到这个父部门的,所有的子部门,然后这样的话,就是说是,如果说这个子部门,不为空,再去遍历这个子部门的子部门,然后对这些叶子部门先进行删除,leafDept.remove();,就这样,然后删完了所有的叶子部门以后,然后在subDept.remove();,就这样,然后删完了所有的叶子部门以后,然后再subDept.remove();
然后最后删除parentDept.remove();,就是你得写这样的代码出来对吧。来看一下啊。
你看,先
删除部门【叶子部门1】
删除部门【叶子部门2】
删除部门【子部门1】
删除部门【叶子部门3】
删除部门【子部门2】
删除部门【父部门】
ok,然后这个,这个对有层级关系的这么一个数据删除,可能就会一坨这个for-if-for-if,你可以想象一下,3级的话,是两个for,一个if,如果说是4级5级6级,7级8级,甚至是无限级呢,你就得不断的for-if,for-if,往下循环去调用,很恶心啊。就这坨代码其实是很恶心的,你自己去想象一下,这个问题都不用我说了,是个人有眼睛都能看得出来对吧,这个是对层级数据的这个那个操作啊,很恶心。很不方便 啊,需要手工编写大量的,这个屎一样的这个代码。你可以看看,这个嵌套层次太多了,到最后代码是没有办法维护的啊,就是平时,我说那个屎一样代码的一个典型特征,就是说是这个,可能有四五个,甚至六七个这种for-if,else,这个嵌套,到最后这个嵌套的非常深,说实话,一年以后团队里,没人看得懂,你写的这个代码啊,就是太难理解了。ok。
好,其实这个就是这样的一个思路,但是如果我们用这个composite,就是说这个组合模式怎么来做,怎么玩,CompositePatternDemo,然后Department这个是没问题的,把这个给搞过来啊,所谓的这个组合模式啊,告诉大家,它其实就是这样子,就是在这里,首先去删除它的时候,它自己就会去看一下说,
public void remove(){
if(children.size() > 0){
for(Department chile: children){
child.remove();
}
}
System.out.println("删除部门【" + name + "】");
}
ok,就这么几行代码,它就已经搞定了,我告诉大家,在main方法中,你可以把组织的部门树这段东西,给它搞过来,搞过来了以后,你可以看一下,parentDept.remove();
我们来看一下,哦了啊
删除部门【叶子部门1】
删除部门【叶子部门2】
删除部门【子部门1】
删除部门【叶子部门3】
删除部门【子部门2】
删除部门【父部门】
哎,效果跟刚才,这坨屎一样 的代码是一模一样,就是如果你要写很多层级的话,没用模式的代码是一大坨啊,但是用了模式的,就用几行代码就搞定了,可以去想象一下,这个就是用了一个递归的这么一个思想,就是什么叫组合模式呢,组合模式的第一要义就是说是,就是将这个树形结构的这个数据,然后可以拼装成,就是树形结构的数据,用一个类,或者两个类,或者少数一两个类吧,然后就可以拼装成,一棵树的那个形状,这是第一件事情,你看一下我们这个类的设计,因为每个Department都包含了一个子部门的类,一个列表,所以说,我们用Department这一个类,就可以把它给拼装出来一棵树的这个形状,这是第一要义啊。
然后,11.19