java23种设计模式(五)--组合模式
时间:2019-06-12
本文章向大家介绍java23种设计模式(五)--组合模式,主要包括java23种设计模式(五)--组合模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
转载:https://www.cnblogs.com/V1haoge/p/6489827.html
定义:所谓组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与树枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式。
使用场景:这种组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。
1、创建抽象类:Node
1 /** 2 * author:YZH 3 * time: 2019/6/12 15:36 4 * description: 抽象类Node 5 **/ 6 public abstract class Node { 7 8 protected String name; 9 10 public Node(String name){ 11 this.name = name; 12 } 13 //新增节点:文件节点无此方法,目录节点重写此方法 14 public void addNode(Node node) throws Exception{ 15 throw new Exception("Invalid exception"); 16 } 17 //显示节点:文件与目录均实现此方法 18 abstract void display(); 19 }
2、创建叶子节点(继承Node)
1 /** 2 * author:YZH 3 * time: 2019/6/12 15:39 4 * description: 文件实现类(叶子节点) 5 **/ 6 public class Filer extends Node { 7 8 public Filer(String name) { 9 super(name); 10 } 11 12 @Override 13 void display() { 14 System.out.println(name); 15 } 16 }
3、创建非叶子节点(继承Node)
1 /** 2 * author:YZH 3 * time: 2019/6/12 15:40 4 * description: 目录实现类(非叶子节点) 5 **/ 6 public class Noder extends Node{ 7 private List<Node>nodeList = new ArrayList<>(); 8 9 public Noder(String name) { 10 super(name); 11 } 12 13 @Override 14 public void addNode(Node node) throws Exception { 15 nodeList.add(node); 16 } 17 18 /** 19 * 递归循环显示 20 */ 21 @Override 22 void display() { 23 System.out.println(name); 24 for (Node node : nodeList) { 25 node.display(); 26 } 27 } 28 }
4、测试代码
1 /** 2 * author:YZH 3 * time: 2019/6/12 15:43 4 * description: 测试代码 5 **/ 6 public class Client { 7 public static void createNode(Node node) throws Exception { 8 File file = new File(node.name); 9 File[] f = file.listFiles(); 10 for(File fi : f){ 11 if(fi.isFile()){ 12 Filer filer = new Filer(fi.getAbsolutePath()); 13 node.addNode(filer); 14 } 15 if(fi.isDirectory()){ 16 Noder noder = new Noder(fi.getAbsolutePath()); 17 node.addNode(noder); 18 createNode(noder);//使用递归生成树结构 19 } 20 } 21 } 22 23 public static void main(String[] args) { 24 Node noder = new Noder("C:\\Users\\11655\\Desktop\\gbase"); 25 try { 26 createNode(noder); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 noder.display(); 31 } 32 }
运行结果:
1 C:\Users\11655\Desktop\gbase 2 C:\Users\11655\Desktop\gbase\2019-06-09 11时.xls 3 C:\Users\11655\Desktop\gbase\drivers 4 C:\Users\11655\Desktop\gbase\drivers\gbase8a 5 C:\Users\11655\Desktop\gbase\drivers\gbase8a\gbase-connector-java-8.3.81.53-build-54.5.1-bin.jar 6 C:\Users\11655\Desktop\gbase\drivers\gbase8a\log.properties 7 C:\Users\11655\Desktop\gbase\drivers\gbase8s 8 C:\Users\11655\Desktop\gbase\drivers\gbase8s\ifxjdbc.jar 9 C:\Users\11655\Desktop\gbase\drivers\gbase8t
原文地址:https://www.cnblogs.com/cq-yangzhou/p/11010585.html
- Silverlight:双向绑定综合应用-多集合的依赖绑定
- python sorted排序用法详解
- Silverlight:MouseDragElementBehavior无法应用于ListBox的变相解决办法
- Silverlight:xap包(或本地缓存)下载版本更新的解决思路
- Web开发感悟:数据绑定是一种技术,更是一门艺术
- 我国域名注册保有量位居世界第二,顶级域名55个
- Silverlight:纠结的快捷键问题
- “default关键字”与“序列化传输”的注意事项
- 常见排序算法-Python实现
- 免费域名与收费域名的差别有哪些?
- c++学习笔记之封装篇(上)
- c++学习笔记之继承篇
- c++学习笔记之继承篇
- silverlight:对象拖动的优雅解决方案
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 数组:就移除个元素很难么?
- JavaScript 测试系列实战(二):深层渲染和快照测试
- 真是没想到,Springboot + Flowable 开发工作流会这么简单!
- 字符串:这道题目,使用库函数一行代码搞定
- 数组:总结篇
- 数组:滑动窗口拯救了你
- Gin 学习之 cookie 读写
- Gin 学习之绑定参数
- 实践 | Kubernetes守护进程集之DaemonSet
- MySQL8.0带来的两点便利
- python写归并排序
- Go 使用标准库 sql 包和三方数据库驱动包操作 MySQL
- Defi?Uniswap 项目漏洞教程新骗局
- Weblogic12c T3 协议安全漫谈
- 联盟链智能合约安全浅析