首页 > 编程语言 >JAVA设计模式学习10——组合模式

JAVA设计模式学习10——组合模式

时间:2023-04-25 11:04:32浏览次数:51  
标签:10 JAVA name void 节点 new 20 设计模式 public

组合模式(Composite)就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。

树图结构一般包含一个根节点,若干个树枝和叶子节点。如下图:

JAVA设计模式学习10——组合模式_java




JAVA设计模式学习10——组合模式_设计模式_02


树结构的类图,其实就是组合模式的简略类图,最上面为抽象节点,左下方为叶子节点,右下方为树枝节点,它含有其他的节点。


1、抽象构建角色(component):作为抽象角色,给组合对象的统一接口。

2、树叶构建角色(leaf):代表组合对象中的树叶对象。

3、树枝构建角色(composite):参加组合的所有子对象的对象,并给出树枝构构建对象的行为。

组合模式在现实中使用很常见,比如文件系统中目录和文件的组成,算式运算,android里面的view和viewgroup等控件,淘宝产品分类信息的展示等都是组合模式的例子。还有个故事:从前山里有座庙,庙里有个老和尚,老和尚对象小和尚讲故事说,从前山里有个庙......退出循环的条件是听厌烦了,或者讲的人讲累了。

这个模式的举例最多的是公司员工的例子。我们这里也以故事雇员为例子来描述:

JAVA设计模式学习10——组合模式_java_03


 

1. package
2. /**
3.  * 
4.  *作者:alaric
5.  *时间:2013-7-20下午5:11:41
6.  *描述:员工和领导的统一接口
7.  */
8. public interface
9.       
10. public void
11.   
12. }


 

1. package
2. /**
3.  * 
4.  *作者:alaric
5.  *时间:2013-7-20下午5:59:11
6.  *描述:普通员工类
7.  */
8. public class Employe implements
9.   
10. private
11.       
12. public
13. super();  
14. this.name = name;  
15.     }  
16. @Override
17. public void
18.         System.out.println(toString());  
19.     }  
20.   
21.   
22. @Override
23. public
24. // TODO Auto-generated method stub
25. return "我叫"+getName()+",就一普通员工!";  
26.     }  
27.   
28. public
29. return
30.     }  
31.   
32. public void
33. this.name = name;  
34.     }     
35.   
36. }

 

1. package
2.   
3. import
4. import
5. import
6.   
7. /**
8.  * 
9.  *作者:alaric
10.  *时间:2013-7-20下午5:14:50
11.  *描述:领导类
12.  */
13. public class Leader implements
14. private List<Worker> workers = new
15. private
16.       
17. public
18. super();  
19. this.name = name;  
20.     }  
21. public void
22.         workers.add(worker);  
23.     }  
24.       
25. public void
26.         workers.remove(worker);  
27.     }  
28.       
29. public Worker getChild(int
30. return
31.     }  
32. @Override
33. public void
34.         System.out.println(toString());  
35.         Iterator<Worker> it = workers.iterator();  
36. while(it.hasNext()){  
37.             it.next().doSomething();  
38.         }  
39.               
40.     }  
41.   
42.       
43. @Override
44. public
45. // TODO Auto-generated method stub
46. return "我叫"+getName()+", 我是一个领导,有 "+workers.size()+"下属。";  
47.     }  
48. public
49. return
50.     }  
51.   
52. public void
53. this.name = name;  
54.     }  
55.   
56. }


1. package
2. /**
3.  * 
4.  *作者:alaric
5.  *时间:2013-7-20下午5:49:37
6.  *描述:测试类
7.  */
8. public class
9.   
10. /**
11.      *作者:alaric
12.      *时间:2013-7-20下午5:49:32
13.      *描述:
14.      */
15. public static void
16. // TODO Auto-generated method stub
17. new Leader("张三");  
18. new Leader("李四");  
19. new Employe("王五");  
20. new Employe("赵六");  
21. new Employe("陈七");  
22. new Employe("徐八");  
23.         leader1.add(leader2);  
24.         leader1.add(employe1);  
25.         leader1.add(employe2);  
26.         leader2.add(employe3);  
27.         leader2.add(employe4);  
28.         leader1.doSomething();  
29.           
30.     }


 运行结果如下:


我叫张三, 我是一个领导,有 3个直接下属。

我叫李四, 我是一个领导,有 2个直接下属。

我叫陈七,就一普通员工!

我叫徐八,就一普通员工!

我叫王五,就一普通员工!

我叫赵六,就一普通员工!

上面员工关系的的树形结构如下:

JAVA设计模式学习10——组合模式_设计模式_04


上面例子给出的组合模式抽象角色里,并没有管理子节点的方法,而是在树枝构建角色,这种模式使得叶子构建角色和树枝构建角色有区分,客户端要分别对待树叶构建角色和树枝构建角色,好处是客户端对叶子节点不会调用管理的方法,当调用时,在编译时就会报错,所以也称安全模式。相对安全模式,还有一种透明模式,就是在抽象角色里面添加管理方法,如下图:

JAVA设计模式学习10——组合模式_java_05


这种做法是对客户端来说叶子和树枝都是一致的接口,相对透明,但是叶子节点在调用管理方法是编译时不会报错,运行时才报错,所以不够安全。两种做法均有利弊,使用时要根据具体情况而权衡。

 


标签:10,JAVA,name,void,节点,new,20,设计模式,public
From: https://blog.51cto.com/u_16087105/6223580

相关文章

  • CyclicBarrier 多线程都能“齐步走”的艺术【Java多线程必备】
    一、介绍  控制多个线程在某个时刻达到一个共同的屏障点(BarrierPoint),然后再同时继续执行。当所有线程都到达屏障点时,屏障就会打开,所有线程可以继续执行,直到下一个屏障点再次等待所有线程到达。二、特性1.可重用  当所有线程到达屏障点后,可以重置屏障,让所有线程再次从屏障......
  • 2023年SHEIN的JAVA后端实习笔试题
    2023年SHEIN笔试题目:10道单选,5道多选,一道算法,一道SQL(单选)1、下列关于线性链表的叙述中,正确的是:进行插入和删除时,不需要移动链表中的元素。2、关于以下程序代码的说明正确的是:classHasStatic{privatestaticintx=100;publicstaticvoidmain(Stringargs[]){......
  • OSD自然OUT之后无法再加入集群-v1-20210308_124828
    OSD自然OUT之后无法再加入集群企业云平台产品中心共享知识库Exportedon03/08/2021TableofContents问题描述4问题原因5解决方法6验证步骤6相关下载链接:OSD自然OUT之后无法再加入集群.pdf1--------这是一条华丽的分割线--------1https://iwiki.woa.com/dow......
  • Android JAVA连接MQTT,以及常见问题
    本文介绍如何使用Android(JAVA)客户机连接MQTT服务器第一步先引入MQTT在 build.gradle添加以下:dependencies{implementation'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'}接下来演示如何连接创建MQTT客户机类 MqttConnect.classpublicclassMqtt......
  • java面试题--Spring
    一、Spring、SpringMVC、SpringBoot的区别是什么?二、????三、SpringMVC工作流程是什么?1、DispatcherServlet接收请求,将请求发给HandlerMapping;2、HandlerMapping根据请求url,匹配到要处理的handler,并包装成处理器执行链,返回给DispatcherServlet。3、DispatcherServlet根据处理器......
  • 比较Python与Java在类的定义、继承、多态等方面的异同
    首先我来进行介绍Python与Java在类的定义、继承、多态等方面的异同1.python类和java类的使用一览java:publicclassCar{privateStringcolor;privateStringmodel;privateintyear;publicCar(Stringcolor,Stringmodel,intyear){......
  • Java 反射机制的一个简单例子.
    一、什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++、Open......
  • java中使用RedisTemplate读取数据异常 Missing type id when trying to resolve subt
    java中使用RedisTemplate读取数据异常Missingtypeidwhentryingtoresolvesubtypeof[simpletype,classjava.lang.Object]:missingtypeidproperty'@class'at[Source:(byte[])"报错:Causedby:com.fasterxml.jackson.databind.exc.InvalidTypeIdExcep......
  • 更新表失败的校验保证数据100%更新
    TRY.INSERTyft10002FROMTABLElt_yft10002.COMMITWORKANDWAIT.DO10TIMES.SELECT*FROMyft10002INTOTABLEpt_yft10002FORALLENTRIESINlt_yft10002WHEREvbeln......
  • java 分词统计
    依赖(谷歌基于lucene的中文分词IKAnalyzer)<dependency><groupId>org.wltea</groupId><artifactId>ikanalyzer</artifactId><version>5.0.2</version></dependency><dependency><groupId>org.apache.lucen......