组合模式:将对象组合成树形结构以表示部分和整体的层次结构. 组合模式使得用户对单个对象和组合对象的适用具有一致性.
先用一个普通的例子来解释一下组合模式. 一个很大的集团公司, 在各个大区开有分公司, 在小地区开有办事处, 一个经理,可以在办事处开展业务, 也可以在分公司工作, 还可以在总公司工作, 这是因为, 不管是总公司, 分公司, 还是办事处, 经理的工作模式基本相同, 而且总公司, 分公司和办事处的外部结构也很相似, 任何一个经过培训的经理, 都可以在总公司, 分公司或办事处工作. 这是因为分公司, 总公司在管理上具有一致的接口. 再举一例, 文件系统中有文件, 也有文件夹(其实是特殊的文件), 文件和文件夹组合在一起, 可以成为一个更大的文件夹. 在用户看来,不管是文件, 还是文件夹, 还是更目录, 对它们的操作都是一致的(当然试图把一个文件夹放到文件下面是不容许的). 这就是说整体和部分具有一致的接口.
基础代码:
- //公共接口
- 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 <a href="http://lib.csdn.net/base/17" class='replace_word' title="Java EE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.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
适用情景: 当部分和整体呈现层次结构, 并且用户希望在操作上忽略部分和整体的差异时. 也就是说组合模式让客户可以一致的适用组合结构和单个对象.