java设计模式之组合模式

来源:互联网 发布:天津知味餐厅 编辑:程序博客网 时间:2024/05/18 01:52

一、什么是组合模式

Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。


二、组合模式的结构


三、组合模式的角色和职责

Component (树形结构的节点抽象)

- 为所有的对象定义统一的接口(公共属性,行为等的定义)

- 提供管理子节点对象的接口方法

- [可选]提供管理父节点对象的接口方法

Leaf (树形结构的叶节点)
Component的实现子类

Composite(树形结构的枝节点)
Component的实现子类


代码实现:

Component (树形结构的节点抽象类)

[java] view plaincopy
  1. package com.qianyan.composite;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 文件节点抽象(是文件和目录的父类) 
  7.  * @author hadoop 
  8.  * 
  9.  */  
  10. public interface IFile {  
  11.   
  12.     /** 
  13.      * 显示文件或者文件夹名称 
  14.      */  
  15.     public void display();  
  16.   
  17.     /** 
  18.      * 添加 
  19.      * @return 
  20.      */  
  21.     public boolean add(IFile file);  
  22.       
  23.     /** 
  24.      * 删除 
  25.      * @return 
  26.      */  
  27.     public boolean remove(IFile file);  
  28.       
  29.     /** 
  30.      * 获取子节点 
  31.      * @return 
  32.      */  
  33.     public List<IFile> getChild();  
  34. }  

Leaf (树形结构的叶节点类)

[java] view plaincopy
  1. package com.qianyan.composite;  
  2.   
  3. import java.util.List;  
  4.   
  5. public class File implements IFile {  
  6.   
  7.     private String name;  
  8.       
  9.     public File(String name) {  
  10.         this.name = name;  
  11.     }  
  12.       
  13.     @Override  
  14.     public void display() {  
  15.         System.out.println(name);  
  16.     }  
  17.   
  18.     @Override  
  19.     public boolean add(IFile file) {  
  20.         return false;  
  21.     }  
  22.   
  23.     @Override  
  24.     public boolean remove(IFile file) {  
  25.         return false;  
  26.     }  
  27.   
  28.     @Override  
  29.     public List<IFile> getChild() {  
  30.         return null;  
  31.     }  
  32.   
  33. }  


Composite(树形结构的枝节点类):

[java] view plaincopy
  1. package com.qianyan.composite;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class Forder implements IFile {  
  7.   
  8.     private String name;  
  9.     private List<IFile> children;  
  10.       
  11.     public Forder(String name) {  
  12.         this.name = name;  
  13.         children = new ArrayList<IFile>();  
  14.     }  
  15.       
  16.     @Override  
  17.     public void display() {  
  18.         System.out.println(name);  
  19.     }  
  20.   
  21.     @Override  
  22.     public boolean add(IFile file) {  
  23.         return children.add(file);  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean remove(IFile file) {  
  28.         return children.remove(file);  
  29.     }  
  30.   
  31.     @Override  
  32.     public List<IFile> getChild() {  
  33.         return children;  
  34.     }  
  35.   
  36. }  

测试类:

[java] view plaincopy
  1. package com.qianyan.composite;  
  2.   
  3. import java.util.List;  
  4.   
  5. public class MainClass {  
  6.   
  7.     public static void main(String[] args) {  
  8.         //c盘  
  9.         Forder root = new Forder("c:");  
  10.           
  11.         //qianyan目录  
  12.         Forder qianyanForder = new Forder("qianyan");  
  13.         //qianyan.txt文件  
  14.         File qianyanFile = new File("qianyan.txt");  
  15.           
  16.         //qianyanChild目录  
  17.         Forder qianyanChildForder = new Forder("qianyanChild");  
  18.         //qianyanChild.txt文件  
  19.         File qianyanChildFile = new File("qianyanChild.txt");  
  20.           
  21.         //添加qianyanChild目录到qianyan目录  
  22.         qianyanForder.add(qianyanChildForder);  
  23.         //添加qianyanChild.txt文件到qianyan目录  
  24.         qianyanForder.add(qianyanChildFile);  
  25.           
  26.         //添加qianyanChild目录到c盘  
  27.         root.add(qianyanForder);  
  28.         //添加qianyan.txt文件到c盘  
  29.         root.add(qianyanFile);  
  30.           
  31.         //显示文件目录结构  
  32.         displayTree(root, 0);  
  33.     }  
  34.       
  35.     public static void displayTree(IFile root, int deep) {  
  36.         for(int i = 0; i < deep; i++)  
  37.             System.out.print("--");  
  38.         //显示自身的名称  
  39.         root.display();  
  40.         //获得子树  
  41.         List<IFile> children = root.getChild();  
  42.         //遍历子树  
  43.         for(int i = 0; i < children.size(); i++) {  
  44.             IFile file = children.get(i);  
  45.             if(file instanceof File) {  
  46.                 for(int j = 0; j <= deep; j++)  
  47.                     System.out.print("--");  
  48.                 file.display();  
  49.             }  
  50.             else  
  51.                 displayTree(file, deep + 1);  
  52.         }  
  53.     }  
  54. }  

测试结果:

[java] view plaincopy
  1. c:  
  2. --qianyan  
  3. ----qianyanChild  
  4. ----qianyanChild.txt  
  5. --qianyan.txt  

原创粉丝点击