java23种设计模式(五)--组合模式
转载:https://www.cnblogs.com/V1haoge/p/6489827.html
定义:所谓组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与树枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式。
使用场景:这种组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。
1、创建抽象类:Node
/**
* author:YZH
* time: 2019/6/12 15:36
* description: 抽象类Node
**/
public abstract class Node { protected String name; public Node(String name){
this.name = name;
}
//新增节点:文件节点无此方法,目录节点重写此方法
public void addNode(Node node) throws Exception{
throw new Exception("Invalid exception");
}
//显示节点:文件与目录均实现此方法
abstract void display();
}
2、创建叶子节点(继承Node)
/**
* author:YZH
* time: 2019/6/12 15:39
* description: 文件实现类(叶子节点)
**/
public class Filer extends Node { public Filer(String name) {
super(name);
} @Override
void display() {
System.out.println(name);
}
}
3、创建非叶子节点(继承Node)
/**
* author:YZH
* time: 2019/6/12 15:40
* description: 目录实现类(非叶子节点)
**/
public class Noder extends Node{
private List<Node>nodeList = new ArrayList<>(); public Noder(String name) {
super(name);
} @Override
public void addNode(Node node) throws Exception {
nodeList.add(node);
} /**
* 递归循环显示
*/
@Override
void display() {
System.out.println(name);
for (Node node : nodeList) {
node.display();
}
}
}
4、测试代码
/**
* author:YZH
* time: 2019/6/12 15:43
* description: 测试代码
**/
public class Client {
public static void createNode(Node node) throws Exception {
File file = new File(node.name);
File[] f = file.listFiles();
for(File fi : f){
if(fi.isFile()){
Filer filer = new Filer(fi.getAbsolutePath());
node.addNode(filer);
}
if(fi.isDirectory()){
Noder noder = new Noder(fi.getAbsolutePath());
node.addNode(noder);
createNode(noder);//使用递归生成树结构
}
}
} public static void main(String[] args) {
Node noder = new Noder("C:\\Users\\11655\\Desktop\\gbase");
try {
createNode(noder);
} catch (Exception e) {
e.printStackTrace();
}
noder.display();
}
}
运行结果:
C:\Users\11655\Desktop\gbase
C:\Users\11655\Desktop\gbase\2019-06-09 11时.xls
C:\Users\11655\Desktop\gbase\drivers
C:\Users\11655\Desktop\gbase\drivers\gbase8a
C:\Users\11655\Desktop\gbase\drivers\gbase8a\gbase-connector-java-8.3.81.53-build-54.5.1-bin.jar
C:\Users\11655\Desktop\gbase\drivers\gbase8a\log.properties
C:\Users\11655\Desktop\gbase\drivers\gbase8s
C:\Users\11655\Desktop\gbase\drivers\gbase8s\ifxjdbc.jar
C:\Users\11655\Desktop\gbase\drivers\gbase8t
java23种设计模式(五)--组合模式的更多相关文章
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- 【Unity3D与23种设计模式】组合模式(Composite)
前段时间在忙一个新项目 博客好久没有更新了 GoF中定义: "将对象以树状结构组合,用以表现部分-全体的层次关系.组合模式让客户端在操作各个对象或组合时是一致的." 是一致的意思就 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- 23种设计模式之组合模式(Composite)
组合模式又称为整体-部分(Part-whole)模式,属于对象的结构模式.在组合模式中,通过组合多个对象形成树形结构以表示整体-部分的结构层次.组合模式对单个对象(即叶子对象)和组合对象(即容器对象) ...
- Java--23种设计模式之decorator模式
装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...
- java23种设计模式之一: 策略模式
由于最近在研究学习设计模式,我会用自己的理解方式来表述对设计模式的学习和认识,通过最常用.好记的案例来记住和使用设计模式,希望对设计代码方面有所提高和改进. 一.应用背景 在软件开发中常常遇到 ...
- java23种设计模式之四:建造者模式
在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名.性别.年龄 ...
- java23种设计模式之: 策略模式,观察者模式
策略模式 --老司机开车,但是他今天想到路虎,明天想开奔驰...针对他不同的需求,来产生不同的应对策略 策略类是一个接口,定义了一个大概的方法,而实现具体的策略则是由实现类完成的,这样的目的是 ...
- java23种设计模式之一: 代理模式(动态代理)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- java23种设计模式之五:代理模式
一.代理模式介绍 代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程 其中代理又分为:静态代理和动态代理 静态代理:指的是自己要写一个代理类,或者用工具生 ...
随机推荐
- linux运维、架构之路-linux用户管理
一. linux系统用户分类 1.分类 ①超级用户:root,UID为0 ②普通用户:UID是500-65535的用户 ③虚拟用户:UID在1-499,一般不能登录,满足文件或服务启动的需要,/sbi ...
- easyui的datagrid里getSelections只能获取一行值???
使用getSelections只能获取到一行的值,检查了半天是因为idField属性值写错,更正之后ok. 解决办法二:改为使用getChecked,idField写错无影响, 注: getSelec ...
- HDU 5179 beautiful number (数位dp / 暴力打表 / dfs)
beautiful number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- php面试专题---18、MySQL查询优化考点
php面试专题---18.MySQL查询优化考点 一.总结 一句话总结: 慢查询:查找分析查询速度慢的原因 数据访问:优化查询过程中的数据访问 长难句:优化长难的查询语句 特定类型:优化特定类型的查询 ...
- Jmeter接口测试报告模板优化(续)
在之前的基础上又优化了一下: 1.增加了对接口响应时间段的统计,如小于0.5s的请求有多少,0.5-1s的有多少,大于1s的有多少.可以自行修改.且不同范围内的时间字体颜色不一样,便于区分. < ...
- Vue过渡:JavaScript钩子
一 App.vue <template> <div id="app"> <button @click="show = !show" ...
- Altium Designer chapter2总结
原理图开发环境这节中需要注意的如下: (1)电路图首先项设定中需注意的地方: 1.General:中经常用到的自动生成交叉节点.放置元件时自动增加选项.复合封装元件的字母数字后缀选项.默认电源对象名称 ...
- Convolutional Neural Networks(5):Pooling Layer
池化层(Pooling layer)同样是收到了视觉神经科学的启发.在初级视觉皮层V1(Primary visual cortex)中,包含了许多复杂细胞(Complex cells),这些细胞对于图 ...
- python学习那点事---pycharm使用弹框问题如何解决
学习python的目标:年后可以找一份不错的维护工作. 2019.11.4日是第一天开始学习python,从开始安装python3.6版本和pycharm开始.安装python版本非常顺利的就完成了, ...
- debain8 安装mysql8
一.下载apt源 https://dev.mysql.com/downloads/repo/apt/ 二.更新apt sudo apt-get update 三.安装mysql sudo apt-ge ...