首页 > 其他分享 >设计模式-组合模式

设计模式-组合模式

时间:2022-10-08 23:44:37浏览次数:49  
标签:这个 组合 删除 模式 叶子 部门 remove Department 设计模式

对层级数据递归调用执行操作。先说一下这个组合模式是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

 

 

 

 

end

标签:这个,组合,删除,模式,叶子,部门,remove,Department,设计模式
From: https://www.cnblogs.com/HarryVan/p/16770532.html

相关文章

  • 文件的操作方式以及读写模式
    1.文件的概念2.文件的操作方式3.文件的读写模式4.文件操作模式5.文件诸多方法6.文件内容修改7.文件光标移动###文件操作```python1.文件的概念文......
  • Lambda表达式实现方式、标准格式、练习、省略模式、注意事项及和匿名内部类的区别
    目录​​一、Lambda表达式实现方式​​​​二、Lambda表达式的标准格式​​​​三、Lambda表达式练习​​​​四、Lambda表达式的省略模式​​​​五、Lambda表达式的注意事......
  • 字符串的模式匹配
    字符串的模式匹配就是在主串中找到子串。基本方法一,是一趟一趟地比较。但是可能引起回溯,从而浪费时间,引起回溯的原因是,主串中从在和子串部分匹配的子串,这样就欺骗了程序......
  • 系统架构模式
    软件架构师和开发人员使用许多体系结构模式。以下是一些模式(混合体系结构样式和体系结构模式)::简单CRUD、单层级、单层。传统N分层。域驱动设计N分层。清......
  • docker网络模式分类
    docker有四种网络模式bridge模式host模式container模式none模式Docker跨host网络:overlay、macvlan......
  • 08-Go设计模式-外观模式
    外观模式示例代码/*外观模式根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。Facade模式也叫外观模式,是由GoF提出的23种设计模式......
  • AcWing算法提高课 分解质因数求组合数
    模板:intprimes[N],cnt;boolnot_prime[N];voidInit(){for(inti=2;i<N;i++){if(!not_prime[i]){primes[cnt++]=i;......
  • 07-Go设计模式-适配模式
    适配模式示例代码/*适配器模式:将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式中的角色和......
  • lucas定理快速求解组合数(适用于MOD较小)
    lucus求解组合数的时间复杂度为O(MODlogn(MOD))适用于MOD较小但n较大的情况模板:LLMOD=1e6+3;LLQuickExp(LLbase,LLexp){LLres=1;while(exp){......
  • 2022 ICPC网络赛(二) G Good Permutation(树形DP 排列组合 建树)
    2022ICPC网络赛(二)GGoodPermutation题意:​ 现在有一个长度为n的排列,现在给出m组约束条件,请问有多少种方案满足这个约束条件。​ 约束条件:给出l,r,表示\([l,r]\)这个......