浅谈JAVA设计模式之——组合模式(Composite)

转载出处:http://blog.csdn.net/l1028386804/article/details/45458081


一、概述

将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对象的使用具有一致性。

二、适用性

1.你想表示对象的部分-整体层次结构。

2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

三、参与者

1.Component 为组合中的对象声明接口。 在适当的情况下,实现所有类共有接口的缺省行为。 声明一个接口用于访问和管理Component的子组件。 (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

2.Leaf 在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义节点对象的行为。 

3.Composite 定义有子部件的那些部件的行为。 存储子部件。 在Component接口中实现与子部件有关的操作。 

4.Client 通过Component接口操纵组合部件的对象。

四、类图

五、示例

Component
[java]  view plain  copy
  1. package com.lyz.design.composite;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 定义Component 类Employer 
  7.  * @author liuyazhuang 
  8.  * 
  9.  */  
  10. public abstract class Employer {  
  11.     private String name;  
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.     public String getName() {  
  16.         return this.name;  
  17.     }  
  18.     public abstract void add(Employer employer);  
  19.       
  20.     public abstract void delete(Employer employer);  
  21.       
  22.     public List<Employer> employers;  
  23.       
  24.     public void printInfo() {  
  25.         System.out.println(name);  
  26.     }  
  27.       
  28.     public List<Employer> getEmployers() {  
  29.         return this.employers;  
  30.     }  
  31. }  

Leaf

[java]  view plain  copy
  1. package com.lyz.design.composite;  
  2. /** 
  3.  * 定义Leaf类Programmer 
  4.  * @author liuyazhuang 
  5.  * 
  6.  */  
  7. public class Programmer extends Employer {  
  8.     public Programmer(String name) {  
  9.         setName(name);  
  10.         employers = null;//程序员, 表示没有下属了  
  11.     }  
  12.     public void add(Employer employer) {  
  13.     }  
  14.   
  15.     public void delete(Employer employer) {  
  16.     }  
  17. }  

[java]  view plain  copy
  1. package com.lyz.design.composite;  
  2. /** 
  3.  * 定义Leaf类ProjectAssistant 
  4.  * @author liuyazhuang 
  5.  * 
  6.  */  
  7. public class ProjectAssistant extends Employer {  
  8.     public ProjectAssistant(String name) {  
  9.         setName(name);  
  10.         employers = null;//项目助理, 表示没有下属了  
  11.     }  
  12.     public void add(Employer employer) {  
  13.           
  14.     }  
  15.   
  16.     public void delete(Employer employer) {  
  17.           
  18.     }  
  19. }  

Composite
[java]  view plain  copy
  1. package com.lyz.design.composite;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. /** 
  6.  * 定义Composite类ProjectManager类 
  7.  * @author liuyazhuang 
  8.  * 
  9.  */  
  10. public class ProjectManager extends Employer {  
  11.     public ProjectManager(String name) {  
  12.         setName(name);  
  13.         employers = new ArrayList<Employer>();  
  14.     }  
  15.       
  16.     public void add(Employer employer) {  
  17.         employers.add(employer);  
  18.     }  
  19.   
  20.     public void delete(Employer employer) {  
  21.         employers.remove(employer);  
  22.     }  
  23. }  

Client
[java]  view plain  copy
  1. package com.lyz.design.composite;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 测试类 
  7.  * @author liuyazhuang 
  8.  * 
  9.  */  
  10. public class Test {  
  11.     public static void main(String[] args) {  
  12.         Employer pm = new ProjectManager("项目经理");  
  13.         Employer pa = new ProjectAssistant("项目助理");  
  14.         Employer programmer1 = new Programmer("程序员一");  
  15.         Employer programmer2 = new Programmer("程序员二");  
  16.           
  17.         pm.add(pa);//为项目经理添加项目助理  
  18.         pm.add(programmer2);//为项目经理添加程序员  
  19.           
  20.         List<Employer> ems = pm.getEmployers();  
  21.         for (Employer em : ems) {  
  22.             System.out.println(em.getName());  
  23.         }  
  24.     }  
  25. }  

result
[java]  view plain  copy
  1. 项目助理  
  2. 程序员二  

猜你喜欢

转载自blog.csdn.net/z1074907546/article/details/78065354