组合模式实际上是一种树形数据结构。以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. Memcached概念、作用、运行原理、特性、不足简单梳理(1)

    大家可能对memcached这种产品早有了解,或者已经应用在自己的网站中了,但是也有一些朋友从来都没有听说过或者使用过.这都没什么关系,本文旨在从各个角度综合的介绍这种产品,尽量深入浅出,如果能对您现 ...

  2. iOS - WKWebView那些坑

    WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView 拥有60fps滚动刷新率. ...

  3. python读取文件行号和内容的便捷方法

    处理数据时候,需要得到数据所在和行号,使用enumerate时便捷的方法: file = open('file.txt','r') for (num,value) in enumerate(file) ...

  4. Python 文件内容读取

    # 读取数据的函数 def readData(filename): with open(filename, 'r') as f: data = f.read().lower() data = list ...

  5. Oracle体系结构之数据文件管理

    数据文件分2个方向管理: 物理结构和逻辑结构. 数据库的存储层次结构图: ............. 逻辑结构:                                  物理结构: .... ...

  6. html 复制 有时不显示样式

    是因为有中文的空格 /**HTML**/ div.ani /**css**/ .ani{ width:480px; height:320px; margin:50px auto; overflow:  ...

  7. 获取linux工具命令源码

    总结: 通过先通过which找到命令路径path rpm -qf  path 获取源码名称n rpm -qi n   获取源码地址 [root@d mongoexport]# rpm --helpUs ...

  8. AllowOverride None

    PHP Advanced and Object-Oriented Programming Larry Ullman <Directory /> AllowOverride None < ...

  9. df and du

    1.若有进程在占用某个文件,而其他进程把这文件删掉,只会删除其在磁盘中的标记,而不会释放其占用的磁盘空间:直到所有访问该文件的进程退出为止: 2.df 是从内核中获取磁盘占用情况数据的,而du是统计当 ...

  10. m4a 转 wav

    https://blog.csdn.net/zjm750617105/article/details/80148473 sox 不行, ffmpeg 很麻烦, 考虑用 avconv 很简单: 安装: ...