设计模式之composite模式

 以下内容来自http://www.lifevv.com

 

本文介绍设计模式中的组合(Composite)模式的概念,用法,以及实际应用中怎么样使用组合模式进行开发。

Composite模式的概念

Composite模式是构造型的设计模式之一,通过递归手段来构造诸如文件系统之类的树形的对象结构;Composite模式所代表的数据构造是一群具有统一接口界面的对象集合,并可以通过一个对象来访问所有的对象(遍历)。

Composite模式的类图描述:
 
[出自:wikimedia.org]

Component 
树形结构的节点抽象
- 为所有的对象定义统一的接口(公共属性,行为等的定义)
- 提供管理子节点对象的接口方法
- [可选]提供管理父节点对象的接口方法

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

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

Composite模式的应用场景

Composite模式概念起来比简单,简单一点说,可以使用Composite模式来构造一个具有统一接口界面的树形的对象群,并可通过该接口访问对象群的每个对象。

Composite模式的应用范例

我们应用Composite模式来实现文件系统的文件/目录结构:
IFile:File与Folder的共通接口界面。相当于Component。
Folder:目录。目录下面有子目录,文件。相当于Composite。
File:文件。存在于目录之中。相当于Leaf。
Client类:测试类或者说使用类。

代码:


 
  1. import  java.util.ArrayList;  
  2. import  java.util.List;  
  3.   
  4. public   class  Client {  
  5.     public   static   void  main(String[] args) {  
  6.           
  7.         //构造一个树形的文件/目录结构   
  8.         Folder rootFolder = new  Folder( "c://" );  
  9.         Folder compositeFolder = new  Folder( "composite" );  
  10.         rootFolder.addChild(compositeFolder);  
  11.         Folder windowsFolder = new  Folder( "windows" );  
  12.         rootFolder.addChild(windowsFolder);  
  13.         File file = new  File( "TestComposite.java" );  
  14.         compositeFolder.addChild(file);  
  15.           
  16.         //从rootFolder访问整个对象群   
  17.         printTree(rootFolder);  
  18.     }  
  19.       
  20.     private   static   void  printTree(IFile ifile) {  
  21.         ifile.printName();  
  22.         List <IFile> children = ifile.getChildren();  
  23.           
  24.         for  (IFile file:children) {  
  25.             if  (file  instanceof  File) {  
  26.                 System.out.print("  " );  
  27.                 file.printName();  
  28.             } else   if  (file  instanceof  Folder) {  
  29.                 printTree(file);  
  30.             }  
  31.         }  
  32.     }  
  33.   
  34. }  
  35.   
  36.   
  37. interface  IFile {  
  38.     public   void  printName();  
  39.       
  40.     public   boolean  addChild(IFile file);  
  41.     public   boolean  removeChild(IFile file);  
  42.     public  List<IFile> getChildren();  
  43. }  
  44.   
  45. class  File  implements  IFile {  
  46.     private  String name;  
  47.       
  48.     public  File(String name) {  
  49.         this .name = name;  
  50.     }  
  51.     public   void  printName() {  
  52.         System.out.println(name);  
  53.     }  
  54.   
  55.     public   boolean  addChild(IFile file) {  
  56.         return   false ;  
  57.     }  
  58.   
  59.     public   boolean  removeChild(IFile file) {  
  60.         return   false ;  
  61.     }  
  62.   
  63.     public  List<IFile> getChildren() {  
  64.         return   null ;  
  65.     }  
  66.       
  67. }  
  68.   
  69. class  Folder  implements  IFile {  
  70.     private  String name;  
  71.     private  List <IFile> childList;  
  72.       
  73.     public  Folder(String name) {  
  74.         this .name = name;  
  75.         this .childList =  new  ArrayList<IFile>();  
  76.     }  
  77.     public   void  printName() {  
  78.         System.out.println(name);  
  79.     }  
  80.   
  81.     public   boolean  addChild(IFile file) {  
  82.         return  childList.add(file);  
  83.     }  
  84.   
  85.     public   boolean  removeChild(IFile file) {  
  86.         return  childList.remove(file);  
  87.     }  
  88.   
  89.     public  List<IFile> getChildren() {  
  90.         return  childList;  
  91.     }  
  92. }  



执行Client,输出结果:
C:/Composite>javac *.java
C:/Composite>java Client
c:/
composite
  TestComposite.java
windows
C:/Composite>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值