注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东东的博客

江南烟雨,同大家一起分享

 
 
 

日志

 
 

设计模式读书笔记之组合模式(Composite)  

2010-07-13 19:59:45|  分类: 设计模式相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

组合模式:将对象组合成树形结构以表示部分和整体的层次结构. 组合模式使得用户对单个对象和组合对象的适用具有一致性.

composite

先用一个普通的例子来解释一下组合模式. 一个很大的集团公司, 在各个大区开有分公司, 在小地区开有办事处, 一个经理,可以在办事处开展业务, 也可以在分公司工作, 还可以在总公司工作, 这是因为, 不管是总公司, 分公司, 还是办事处, 经理的工作模式基本相同, 而且总公司, 分公司和办事处的外部结构也很相似, 任何一个经过培训的经理, 都可以在总公司, 分公司或办事处工作.  这是因为分公司, 总公司在管理上具有一致的接口. 再举一例, 文件系统中有文件, 也有文件夹(其实是特殊的文件), 文件和文件夹组合在一起, 可以成为一个更大的文件夹. 在用户看来,不管是文件, 还是文件夹, 还是更目录, 对它们的操作都是一致的(当然试图把一个文件夹放到文件下面是不容许的). 这就是说整体和部分具有一致的接口.

基础代码:


view plaincopy to clipboardprint?
//公共接口  
package designpattern.composite;  
public interface Component {  
    public void add(Component c);  
    public void remove(Component c);  
    public void display(int depth);  
}  
//叶子节点  
package designpattern.composite;  
public class Leaf implements Component{  
    private String name;  
    public Leaf(String n){  
        this.name = n;  
    }  
    public void add(Component c) {  
        System.out.println("leaf node can't add sub component.");  
    }  
    public void display(int depth) {  
        String sketon = "";  
        for(int i=0; i<depth; i++){  
            sketon += "-";  
        }  
        System.out.println(sketon + name);  
    }  
    public void remove(Component c) {  
        System.out.println("leaf node can't remove sub component.");  
    }  
}  
//枝节点  
package designpattern.composite;  
import java.util.*;  
  
public class Composite implements Component{  
    List<Component> children = new ArrayList<Component>();  
    private String name;  
    public Composite(String name){  
        this.name = name;  
    }  
      
    public void add(Component c) {  
        children.add(c);  
    }  
    public void remove(Component c) {  
        children.remove(c);  
    }  
    public void display(int depth) {  
        String sketon = "";  
        for(int i=0; i<depth; i++){  
            sketon += "-";  
        }  
        System.out.println(sketon + name);  
        for(Component c : children){  
            c.display(depth + 2);  
        }  
    }  
}  
//测试用例 使用组合模式构造windows系统c盘目录结构  
package designpattern.composite;  
  
public class Test {  
    public static void main(String[] args){  
        Component root = new Composite("C:\\");  
        Component programs = new Composite("Program Files");  
        programs.add(new Leaf("360杀毒"));  
        programs.add(new Leaf("Office 2007"));  
        programs.add(new Leaf("Movie Maker"));  
        Component windows = new Composite("Windows");  
        windows.add(new Leaf("system"));  
        windows.add(new Leaf("system32"));  
        windows.add(new Leaf("temp"));  
        Component autoexec = new Leaf("AUTOEXEC.BAT");  
        Component boot = new Leaf("boot.ini");  
        root.add(programs);  
        root.add(windows);  
        root.add(autoexec);  
        root.add(boot);  
        root.display(0);  
    }  
}  

以上程序的最后输出:


view plaincopy to clipboardprint?
C:\  
--Program Files  
----360杀毒  
----Office 2007  
----Movie Maker  
--Windows  
----system  
----system32  
----temp  
--AUTOEXEC.BAT  
--boot.ini  
C:\ --Program Files ----360杀毒 ----Office 2007 ----Movie Maker --Windows ----system ----system32 ----temp --AUTOEXEC.BAT --boot.ini

适用情景: 当部分和整体呈现层次结构, 并且用户希望在操作上忽略部分和整体的差异时. 也就是说组合模式让客户可以一致的适用组合结构和单个对象.

转自:http://blog.csdn.net/sunxing007/archive/2010/03/28/5425737.aspx

  评论这张
 
阅读(640)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017