Java设计模式应用——组合模式
组合模式实际上是一种树形数据结构。以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设计模式应用——组合模式的更多相关文章
- java设计模式之组合模式
组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...
- java设计模式5.组合模式、门面模式、享元模式、桥接模式
组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...
- JAVA设计模式之组合模式(composite)
组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...
- 老和尚给小和尚讲故事引发了Java设计模式:组合模式
目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
随机推荐
- Spark版本发布历史,及其各版本特性
2016年11月5日 We are proud to announce that Apache Spark won the 2016 CloudSort Benchmark (both Dayto ...
- AD初体验
首先是因为想用51做个小项目,所以想到不如成这个机会把AD学一下吧,老师说我们这个专业无论画图还是电路设计都得精通,想想自己还是能力欠缺,到大三了才开始学习绘制 原理图. 好了废话不说,下面说说我的第 ...
- 如何取消一个目录的git初始化
一不小心把我的整个home目录都初始化为git仓库了,通过执行删除.git命令,可以恢复 rm -rf .git
- HDFS 命令深入浅出
HDFS 命令深入浅出~ [root@neusoft-master ~]# hadoop dfs Usage: hadoop fs [generic options] [-appendToFile & ...
- POJ 1185 - 炮兵阵地 & HDU 4539 - 郑厂长系列故事——排兵布阵 - [状压DP]
印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit ...
- hadoop2.x编译安装
Build instructions for Hadoop (Hadoop 编译安装,参考hadoop源码包中BUILDING.txt文档) ----------------------------- ...
- php安装redis扩展'checking for igbinary includes... configure: error: Cannot find igbinary.h'解决方法
今天准备给yii2安装redis扩展,先安装了redis服务,然后安装redis php官方扩展,在make的时候提示' checking for igbinary includes... confi ...
- [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode
#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #defin ...
- B. Berland National Library---cf567B(set|模拟)
题目链接:http://codeforces.com/problemset/problem/567/B 题意:题目大意: 一个计数器, +号代表一个人进入图书馆, -号代表一个人出去图书馆. 给一个 ...
- 牛客练习赛18E pocky游戏 状压dp
正解:状压dp+辅助dp 解题报告: 来还债辣!NOIp之后还是轻松很多了呢,可以一点点儿落实之前欠下的各种东西一点点提升自己!加油鸭! 是个好题,可以积累套路,启发性强,而且很难 哦而且状压它也是个 ...