组合模式实际上是一种树形数据结构。以windows目录系统举例,怎么样用java语言描述一个文件夹?

定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类。

进一步抽象,把文件夹和文件都看做节点,于是一个文件夹就可以描述为一个节点类,包含若干个子节点。

我们看看组合模式的代码

// 抽象节点
public abstract class Node
{
protected String name;
abstract void add(Node node);
abstract void removed(Node node);
abstract void foreach(); public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
}
} // 文件类
public class File extends Node
{
@Override
void add(Node node)
{
} @Override
void removed(Node node)
{
} @Override
void foreach()
{
System.out.println("File name is " + name);
} public File(String name)
{
this.name = name;
}
} // 文件夹类
import java.util.ArrayList;
import java.util.List; public class Folder extends Node
{
List<Node> nodes = new ArrayList<Node>(); @Override
void add(Node node)
{
nodes.add(node);
} @Override
void removed(Node node)
{
nodes.remove(node);
} @Override
void foreach()
{
System.out.println("Folder name is " + name);
for(Node node : nodes)
{
node.foreach();
}
} public Folder(String name)
{
this.name = name;
}
}

测试类

package com.coshaho.learn.component;

public class Test
{
public static void main(String[] args)
{
Folder root = new Folder("Root");
Folder music = new Folder("Music");
Folder software = new Folder("Software");
root.add(music);
root.add(software);
File explain = new File("explain.txt");
File moon = new File("moon.mp3");
File word = new File("word.exe");
root.add(explain);
music.add(moon);
software.add(word);
root.foreach();
}
}

在实际应用中,我们希望使用json传递树形结构数据,我们希望每层节点定义都一样,不通过类来区分叶子节点和非叶子节点。这个时候我们可以简单的在Node对象中增加一个isLeaf属性,用来表示该节点是否是叶子节点。这种数据结构是一种递归结构,可以使用递归算法解析。

package com.coshaho.learn.component;

import java.util.ArrayList;
import java.util.List; import org.springframework.util.CollectionUtils; public class TreeNode
{
private String name; private boolean isLeaf; private List<TreeNode> nodes = new ArrayList<TreeNode>(); private TreeNode(String name, boolean isLeaf)
{
this.name = name;
this.isLeaf = isLeaf;
} void add(TreeNode node)
{
nodes.add(node);
} void removed(TreeNode node)
{
nodes.remove(node);
} public String toString()
{
String nameInfo = "name: " + name;
String typeInfo = "isLeaf: " + isLeaf;
String value ="";
if(isLeaf || CollectionUtils.isEmpty(nodes))
{
value = "{" + nameInfo + "," + typeInfo + "}";
}
else
{
String childrenInfo = "children: [";
for(TreeNode node : nodes)
{
childrenInfo = childrenInfo + node.toString() + ",";
}
childrenInfo = childrenInfo.substring(0, childrenInfo.length() - 1) + "]";
value = "{" + nameInfo + "," + typeInfo + "," + childrenInfo + "}";
}
return value;
} public static void main(String[] args)
{
TreeNode all = new TreeNode("All", false);
TreeNode guangdong = new TreeNode("GuangdDong", true);
TreeNode sichuan = new TreeNode("SiChuan", false);
TreeNode chengdu = new TreeNode("ChengDu", true);
all.add(guangdong);
all.add(sichuan);
sichuan.add(chengdu);
System.out.println(all);
}
}

Java设计模式应用——组合模式的更多相关文章

  1. java设计模式之组合模式

    组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...

  2. java设计模式5.组合模式、门面模式、享元模式、桥接模式

    组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...

  3. JAVA设计模式之组合模式(composite)

    组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...

  4. 老和尚给小和尚讲故事引发了Java设计模式:组合模式

    目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...

  5. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  6. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  7. 折腾Java设计模式之访问者模式

    博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...

  8. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  9. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

随机推荐

  1. node中非常重要的process对象,Child Process模块

    node中非常重要的process对象,Child Process模块Child Process模块http://javascript.ruanyifeng.com/nodejs/child-proc ...

  2. Html5游戏框架createJs组件--EaselJS(二)绘图类graphics

    有端友问我是否有文档,有确实有,但没有中文的,只有英文的,先提供浏览地址供大家参考学习createJs英文文档.                        EaselJS其实主要就是createJ ...

  3. 【转】UTF16和UTF8什么区别?

    这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的“另存为 ...

  4. Hive FUNCTIONS函数

    hive> SHOW FUNCTIONS; ! != % & * + - / < <= <=> <> = == > >= ^ abs ac ...

  5. UOJ 145 - 神奇的幻方 - [简单数学题]

    题目链接:http://uoj.ac/problem/145 题目描述 幻方是一种很神奇的 N∗N 矩阵:它由数字 1,2,3,⋯⋯,N×N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N ...

  6. Oracle to_date()函数的用法介绍

    to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,需要的朋友可以参考下     在Oracle数据库中,Oracle t ...

  7. Oracle备份恢复之rman备份oracle数据库

    备份需求和rman备份 oracle数据库的备份相关问答: 1)备份时数据库处于何种状态? 备份时数据库处于OPEN状态,这样数据库可以正常工作. 2)备份的数据备份在什么地方? 备份在本地磁盘. 3 ...

  8. wordpress设置固定链接无效的解决办法

    声明:本人用的是Ubuntu 10.04 LAMP服务 以下内容是针对在Apache服务器下Wordpress修改固定链接出错无效的解决办法: 如果改了固定链接以后出问题,请查看Wordpress根目 ...

  9. Linux上Oracle 11g安装步骤图解

    Oracle 11g下载地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 选 ...

  10. oracle数据迁移到mysql

    今天遇到需求要把oracle的部分数据搬到mysql,用java代码抓数据,然后拼接成sql语句,然后用navicat执行sql脚本的方法,导入数据库. import oracle.jdbc.driv ...