当前位置:首页 > 开发 > 编程语言 > 设计模式 > 正文

读《研磨设计模式》-代码笔记-组合模式

发表于: 2012-08-23   作者:bylijinnan   来源:转载   浏览:
摘要: 声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.ArrayList; import java.util.List; abstract class Component { public abstract void printStruct(Str
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/




import java.util.ArrayList;
import java.util.List;

abstract class Component {
	
	public abstract void printStruct(String preStr);
	
	/*以下三个方法简单地抛出例外。叶子类Leaf不覆盖这些方法,表示不支持。而Composite则重写这些方法
	 * 这涉及到组合模式的透明性和安全性,就是说叶子类要不要知道这些方法
	 * 如果从安全性考虑,那叶子类不要知道这些方法,就不要在父类(Component)中定义
	 * 个人认为透明性更重要一些,可以将Leaf和Composite的操作统一起来
	 */
	public void addChild(Component child) {
		throw new UnsupportedOperationException("addChild():not allowed.");
	}
	
	public void removeChild(Component child) {
		throw new UnsupportedOperationException("removeChild():not allowed.");
	}
	
	public Component getChild(int index) {
		throw new UnsupportedOperationException("getChild():not allowed.");
	}
	
	/*书上提到两个扩展:
	 * 1.父组件引用。主要用在删除上:当子目录删除时,子目录下的元素上移一层(将这些元素的父目录设为子目录的上一层):
			private Component parent;
			private List<Component> children;
	 * 2.环状引用。要记录路径,以免重复
	 */
}

class Leaf extends Component {
	private String name;
	public Leaf(String name) {
		this.name = name;
	}
	@Override
	public void printStruct(String preStr) {
		System.out.println(preStr + "-" + name);
	}
}

class Composite extends Component {

	private String name;

	private List<Component> list;
	
	public Composite(String name) {
		this.name = name;
	}

	public void addChild(Component child) {
		if (list == null) {
			list = new ArrayList<Component>();
		}
		list.add(child);
	}
	
	public void removeChild(Component child) {
		if (list != null) {
			list.remove(child);
		}
	}
	
	@Override
	public void printStruct(String preStr) {
		System.out.println(preStr + "+" + name);
		if (list != null) {
			preStr += " ";
			for (Component child : list) {
				child.printStruct(preStr);
			}
		}
	}
	
	
}

public class CompositePattern {

	public static void main(String[] args) {
		Component root = new Composite("服装");
		Component c1 = new Composite("男装");
		Component c2 = new Composite("女装");

		// 定义所有的叶子对象
		Component leaf1 = new Leaf("衬衣");
		Component leaf2 = new Leaf("夹克");
		Component leaf3 = new Leaf("裙子");
		Component leaf4 = new Leaf("套装");

		// 按照树的结构来组合组合对象和叶子对象
		root.addChild(c1);
		root.addChild(c2);
		c1.addChild(leaf1);
		c1.addChild(leaf2);
		c2.addChild(leaf3);
		c2.addChild(leaf4);
		// 调用根对象的输出功能来输出整棵树
		root.printStruct("");
	}

}

读《研磨设计模式》-代码笔记-组合模式

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一、什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示‘部分---整体’的层次
特性: 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素
1. 概述   将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组
组合模式 又称合成模式,属于对象的结构模式,也被叫做部分-整体模式。 合成模式将对象组织到树结构
一、模式定义 组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。 组合模式对单个对
组合模式 又称合成模式,属于对象的结构模式,也被叫做部分-整体模式。 合成模式将对象组织到树结构
组合模式:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理
组合模式(Composite):将对象组合成树状结构以表示“整体-部分”层次结构,组合模式使得用户对单
1 定义: 1.1 定义:Compose objects into tree structures to represent part-whole hierarchies.
定义: 将对象组合成树形结构以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号