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模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
随机推荐
- Bitbucket - 用git 用法
核心流程: 从远端中心repo那里Git clone 到本地,再在本地开发(add, commit), 通常会利用branch管理,如果觉得code 没问题了,就push到远端的中心repo上.这里中 ...
- 为自定义的View添加长按事件
以前开发画板组件时,要添加一个长按监听事件,这个画板实际上就是继承自View的一个自定义组件. 首先,设置好长按事件发生时要触发的操作: private class LongPressRunnable ...
- CentOS 6U7分区大于2TB的磁盘以及挂载大于16TB分区磁盘的解决方案
一.内容介绍1.问题描述1).问题一 CentOS 6.x 在格式化大于16TB的ext4分区时,会提示如下错误: mke2fs 1.41.12 (17-May-2010)mkfs.ext4: Siz ...
- 洛谷P2569 股票交易【dp】【单调队列】
题目描述 最近 \text{lxhgww}lxhgww 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\text{lxhgww}lxhgww 预测到了 ...
- FZU2110 Star【计算几何】
Overpower often go to the playground with classmates. They play and chat on the playground. One day, ...
- Sublime Text3注册激活和部分配置
1. 更改hosts文件(参照:sublime text3 破解方法,亲测有效) windows系统的hosts文件在C:\Windows\System32\drivers\etc在hosts文件中 ...
- 详解回调函数——以JS为例解读异步、回调和EventLoop
回调,是非常基本的概念,尤其在现今NodeJS诞生与蓬勃发展中变得更加被人们重视.很多朋友学NodeJS,学很久一直摸不着门道,觉得最后在用Express写Web程序,有这样的感觉只能说明没有学懂 ...
- Why String is Immutable or Final in Java
The string is Immutable in Java because String objects are cached in String pool. Since cached Strin ...
- mysql transaction 事务
1.事务简介 一个"最小的"不可再分的"工作单元". 一个事务通常对应了一个完整的业务.如:银行的转账功能,a转账给b,a扣钱,b加钱. 一个事务包含一条或多条 ...
- 类似CFS程式发布注意事项
1.CFS 此AP 程式的验证方式为Forms 验证.需要在IIS 中做如下设置(Forms 身份验证,配套的Web.config 中要有对应节点代码,后台代码中要有获取方式) 2.Forms 身份验 ...