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

本文介绍了组合模式的概念及其在软件设计中的应用。通过一个具体的员工管理案例,展示了如何利用组合模式实现部分与整体之间的灵活操作,使客户端能以统一的方式处理单个对象和组合对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://alaric.iteye.com/blog/1910919

 

这节开始学习结构模式,结构模式包括:组合模式、门面模式、适配器模式、代理模式、装饰模式、桥模式、享元模式。从组合模式开始学习。

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

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

可以用一个类图描述树结构的静态结构,把根节点当做树枝节点来描述,同时和叶子节点具有共同的父类:

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

通过以上结构图可以看出,组合模式有以下角色:

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

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

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

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

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



 

 

Java代码   收藏代码
  1. package composite;  
  2. /** 
  3.  *  
  4.  *作者:alaric 
  5.  *时间:2013-7-20下午5:11:41 
  6.  *描述:员工和领导的统一接口 
  7.  */  
  8. public interface Worker {  
  9.       
  10.     public void doSomething();  
  11.   
  12. }  

 

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

 

Java代码   收藏代码
  1. package composite;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.List;  
  5. import java.util.concurrent.CopyOnWriteArrayList;  
  6.   
  7. /** 
  8.  *  
  9.  *作者:alaric 
  10.  *时间:2013-7-20下午5:14:50 
  11.  *描述:领导类 
  12.  */  
  13. public class Leader implements Worker {  
  14.     private List<Worker> workers = new CopyOnWriteArrayList<Worker>();    
  15.     private String name;  
  16.       
  17.     public Leader(String name) {  
  18.         super();  
  19.         this.name = name;  
  20.     }  
  21.     public void add(Worker worker){  
  22.         workers.add(worker);  
  23.     }  
  24.       
  25.     public void remove(Worker worker){  
  26.         workers.remove(worker);  
  27.     }  
  28.       
  29.     public Worker getChild(int i){  
  30.         return workers.get(i);  
  31.     }  
  32.     @Override  
  33.     public void doSomething() {  
  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 String toString() {  
  45.         // TODO Auto-generated method stub  
  46.         return "我叫"+getName()+", 我是一个领导,有 "+workers.size()+"下属。";  
  47.     }  
  48.     public String getName() {  
  49.         return name;  
  50.     }  
  51.   
  52.     public void setName(String name) {  
  53.         this.name = name;  
  54.     }  
  55.   
  56. }  

 

Java代码   收藏代码
  1. package composite;  
  2. /** 
  3.  *  
  4.  *作者:alaric 
  5.  *时间:2013-7-20下午5:49:37 
  6.  *描述:测试类 
  7.  */  
  8. public class Client {  
  9.   
  10.     /** 
  11.      *作者:alaric 
  12.      *时间:2013-7-20下午5:49:32 
  13.      *描述: 
  14.      */  
  15.     public static void main(String[] args) {  
  16.         // TODO Auto-generated method stub  
  17.         Leader leader1 = new Leader("张三");  
  18.         Leader leader2 = new Leader("李四");  
  19.         Employe employe1 = new Employe("王五");  
  20.         Employe employe2 = new Employe("赵六");  
  21.         Employe employe3 = new Employe("陈七");  
  22.         Employe employe4 = 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个直接下属。

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

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

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

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

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


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


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值