独角兽企业重金招聘Python工程师标准>>>
一、什么是组合模式?
组合模式(Composite)定义:将对象组合成树形结构以表示‘部分---整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性.
类型:结构型模式
顺口溜:适装桥组享代外
二、组合模式UML
三、JAVA代码实现
packagecom.posite;publicabstractclassComponent{protectedStringname;publicComponent(Stringname){this.name=name;}publicabstractvoidadd(Componentc);publicabstractvoidremove(Componentc);publicabstractvoiddisplay(intdepth);}packagecom.posite;importjava.util.ArrayList;importjava.util.List;publicclassCompositeextendsComponent{publicComposite(Stringname){super(name);}privateList<Component>components=newArrayList<Component>();@Overridepublicvoidadd(Componentc){components.add(c);}@Overridepublicvoidremove(Componentc){components.remove(c);}@Overridepublicvoiddisplay(intdepth){System.out.println(Util.concat("-",depth++).concat(name));for(Componentcomponent:components){component.display(depth+1);}}}packagecom.posite;publicclassLeafextendsComponent{publicLeaf(Stringname){super(name);}@Overridepublicvoidadd(Componentc){System.out.println("thisisleaf,cannotbeadded!");}@Overridepublicvoidremove(Componentc){System.out.println("thisisleaf,cannotberemoved!");}@Overridepublicvoiddisplay(intdepth){System.out.println(Util.concat("-",depth).concat(name));}}packagecom.posite;publicclassUtil{publicstaticStringconcat(Stringstr,intnum){StringBuildersb=newStringBuilder();for(inti=0;i<num;i++){sb.append(str);}returnsb.toString();}publicstaticvoidmain(String[]args){System.out.println(concat("-",3));}}packagecom.posite;publicclassClient{publicstaticvoidmain(String[]args){Componentc=newComposite("root");c.add(newLeaf("leaf1"));c.add(newLeaf("leaf2"));Componentsub=newComposite("sub1");sub.add(newLeaf("grand1"));sub.add(newLeaf("grand2"));Componentsub2=newComposite("sub2");sub2.add(newLeaf("grand3"));sub2.add(newLeaf("grand4"));c.add(sub);c.add(sub2);c.display(1);}}
输出结果:
四、使用场景
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”
五、源码地址
本系列文章源码地址,/amosli/dp 欢迎Fork & Star !!