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

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

设计模式读书笔记之组合模式(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

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

 

你可能感兴趣的:(设计模式,c,windows,读书,360)