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

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

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

基础代码:

//公共接口 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); } }

以上程序的最后输出:

C:/ --Program Files ----360杀毒 ----Office 2007 ----Movie Maker --Windows ----system ----system32 ----temp --AUTOEXEC.BAT --boot.ini

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

 

你可能感兴趣的:(设计模式,windows,工作,String,读书,Class)