类图

/**
* 树 总体
*
* @author stone
*
*/
public class Tree {
private TreeNode root; //根节点 public Tree(String name) {
this.root = new TreeNode(name);
} public TreeNode getRoot() {
return root;
}
}
/**
* 树节点 部份
* 也能够自身代表树:一堆节点组成了一颗树
*
* @author stone
*
*/
public class TreeNode { private String name;
private TreeNode parent;
private List<TreeNode> children; public TreeNode(String name) {
this.name = name;
this.children = new ArrayList<TreeNode>();
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setParent(TreeNode parent) {
this.parent = parent;
} public TreeNode getParent() {
return parent;
} public List<TreeNode> getChildren() {
return children;
} public void add(TreeNode node) {
this.children.add(node);
} public void remove(TreeNode node) {
this.children.remove(node);
}
}
/*
* 组合(Composite)模式 又叫做部分-总体模式
* 它使我们层级、树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序能够像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
* 以下情况下适用Composite模式:
1.你想表示对象的部分-总体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的全部对象。
*/
public class Test {
public static void main(String[] args) {
// Tree treeA = new Tree("A");
// treeA.getRoot().add(new TreeNode("B"));
// treeA.getRoot().add(new TreeNode("C"));
// TreeNode treeNodeD = new TreeNode("D");
// treeNodeD.add(new TreeNode("D1"));
// treeNodeD.add(new TreeNode("D2"));
// treeA.getRoot().add(treeNodeD);
// print(treeA.getRoot());
/*
* 上面使用了Tree对象,
* 以下仅仅使用TreeNode对象,符合组合模式的定义,既代表部分也代表总体
*/
TreeNode treeA = new TreeNode("A");
treeA.add(new TreeNode("B"));
treeA.add(new TreeNode("C"));
TreeNode treeNodeD = new TreeNode("D");
treeNodeD.add(new TreeNode("D1"));
treeNodeD.add(new TreeNode("D2"));
treeA.add(treeNodeD);
print(treeA);
/*
* 其它演示样例:文件系统{文件夹、文件}, 相似这样的可用递归遍历的结构,
* 用一个对象就能表示部分与总体,都能够用组合模式
*/ } public static void print(TreeNode root) {
if (root == null) return;
LinkedList<TreeNode> linkedList = new LinkedList<TreeNode>();
linkedList.add(root);
while (!linkedList.isEmpty()) {
TreeNode node = linkedList.removeFirst();
System.out.println(node.getName());
List<TreeNode> children = node.getChildren();
for (int i = 0; i < children.size(); i++) {
TreeNode next = children.get(i);
List<TreeNode> children2 = next.getChildren();
if (!children2.isEmpty()) {
linkedList.add(next);
} else {
System.out.println(next.getName());
}
}
}
}
}

打印

A
B
C
D
D1
D2

Java 实现组合(Composite)模式的更多相关文章

  1. C++设计模式实现--组合(Composite)模式

    一. 举例 这个样例是书上的,如果有一个公司的组结结构例如以下: 它的结构非常像一棵树,当中人力资源部和財务部是没有子结点的,详细公司才有子结点. 并且最关健的是,它的每一层结构非常相似. 代码实现例 ...

  2. 组合(composite)模式

    定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象.组 ...

  3. 设计模式C++描述----11.组合(Composite)模式

    一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...

  4. 八、结构模式之组合(Composite)模式

    组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...

  5. Head First 设计模式 —— 11. 组合 (Composite) 模式

    思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...

  6. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...

  7. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  8. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  9. 【设计模式】Java设计模式 - 组合模式

    Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

随机推荐

  1. mjpg-streamer on raspberrypi

    http://sourceforge.net/projects/mjpg-streamer/ svn address svn checkout svn://svn.code.sf.net/p/mjpg ...

  2. STL--自定义类型的排序

    STL的排序太坑了,尤其是在VS2010上重载sort函数的第三个比较参数的时候. invalid operator < 这个错在写多关键字排序的时候就没有停止过. 本来想查书解决,结果各种重载 ...

  3. easyui源码翻译1.32--Slider(滑动条)

    前言 使用$.fn.slider.defaults重写默认值对象.下载该插件翻译源码 滑动条允许用户从一个有限的范围内选择一个数值.当滑块控件沿着轨道移动的时候,将会显示一个提示来表示当前值.用户可以 ...

  4. CAN

    CAN Introduction Features Network Topology(CANbus網路架構) MESSAGE TRANSFER(CAN通訊的資料格式) 1.DATA FRAME(資料通 ...

  5. Android Touch事件传递机制

    1.基础知识 (1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置.时间.历史记录以及第几个手指(多指触摸)等. (2) 事件类型分为ACTION_DOWN, ACT ...

  6. html5 动画精灵

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  7. gzip [选项] 压缩(解压缩)

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用. 语法:gzip ...

  8. Oracle Kill Session – FRM-40501

    FRM-40501: ORACLE error: unable to reserve record for update or delete frm-40501:oracle 错误:无法保留用于更新或 ...

  9. hadoop异常: 到目前为止解决的最牛逼的一个异常(java.io.IOException: Incompatible clusterIDs)

    (注意: 本人用的版本为hadoop2.2.0, 旧的版本和此版本的解决方法不同) 异常为: 9 (storage id DS-2102177634-172.16.102.203-50010-1384 ...

  10. Eclipse中输入系统变量和运行参数

    在开发时,有时候可能需要根据不同的环境设置不同的系统参数,我们都知道,在使用java -jar命令时可以使用-D参数来设置运行时的系统变量,同样,在Eclipse中运行java程序时,我们怎么设置该系 ...