合成模式代码示例

2023-10-31

package com.example.hecheng;


public interface IFile
{
	
	//返回自己的实例 
	IFile getComposite();
	
	//某个商业方法 
	void sampleOperation();
	
	//获取深度 
	int getDeep();
	
	//设置深度 
	void setDeep(
			int x );
}
</pre><p></p><p></p><pre name="code" class="html">package com.example.hecheng;



public class File implements IFile
{
	
	private String name; //文件名字 
	private int deep; //层级深度 
	
	public File(
			String name )
	{
		this.name = name;
	}
	
	//返回自己的实例 
	public IFile getComposite()
	{
		return this;
	}
	
	//某个商业方法 
	public void sampleOperation()
	{
		System.out.println( "执行了某个商业方法!" );
	}
	
	public String getName()
	{
		return name;
	}
	
	public void setName(
			String name )
	{
		this.name = name;
	}
	
	public int getDeep()
	{
		return deep;
	}
	
	public void setDeep(
			int deep )
	{
		this.deep = deep;
	}
}


package com.example.hecheng;


import java.util.Vector;

public class Folder implements IFile
{
	
	private String name; //文件名字 
	private int deep; //层级深度,根深度为0 
	private Vector<IFile> componentVector = new Vector<IFile>();
	
	public Folder(
			String name )
	{
		this.name = name;
	}
	
	//返回自己的实例 
	public IFile getComposite()
	{
		return this;
	}
	
	//某个商业方法 
	public void sampleOperation()
	{
		System.out.println( "执行了某个商业方法!" );
	}
	
	//增加一个文件或文件夹 
	public void add(
			IFile IFile )
	{
		componentVector.addElement( IFile );
		IFile.setDeep( this.deep + 1 );
	}
	
	//删除一个文件或文件夹 
	public void remove(
			IFile IFile )
	{
		componentVector.removeElement( IFile );
	}
	
	//返回直接子文件(夹)集合 
	public Vector getAllComponent()
	{
		return componentVector;
	}
	
	public String getName()
	{
		return name;
	}
	
	public void setName(
			String name )
	{
		this.name = name;
	}
	
	public int getDeep()
	{
		return deep;
	}
	
	public void setDeep(
			int deep )
	{
		this.deep = deep;
	}
}

package com.example.hecheng;


import java.util.Iterator;
import java.util.Vector;


public class TestActivity
{
	
	public static String indentChar = "\t"; //文件层次缩进字符 
	
	public static void main(
			String args[] )
	{
		new TestActivity().test();
	}
	
	/** 
	 * 客户端测试方法 
	 */
	public void test()
	{
		//根下文件及文件夹 
		Folder root = new Folder( "树根" );
		Folder b1_1 = new Folder( "1_枝1" );
		Folder b1_2 = new Folder( "1_枝2" );
		Folder b1_3 = new Folder( "1_枝3" );
		File l1_1 = new File( "1_叶1" );
		File l1_2 = new File( "1_叶2" );
		File l1_3 = new File( "1_叶3" );
		//b1_2下的文件及文件夹 
		Folder b2_1 = new Folder( "2_枝1" );
		Folder b2_2 = new Folder( "2_枝2" );
		File l2_1 = new File( "2_叶1" );
		//缔造树的层次关系(简单测试,没有重复添加的控制) 
		root.add( b1_1 );
		root.add( b1_2 );
		root.add( l1_1 );
		root.add( l1_2 );
		b1_2.add( b2_1 );
		b1_2.add( b2_2 );
		b1_2.add( l2_1 );
		root.add( l1_3 );
		root.add( b1_3 );
		//控制台打印树的层次 
		outTree( root );
	}
	
	public void outTree(
			Folder folder )
	{
		System.out.println( folder.getName() );
		iterateTree( folder );
	}
	
	/** 
	 * 遍历文件夹,输入文件树 
	 * 
	 * @param folder 
	 */
	public void iterateTree(
			Folder folder )
	{
		Vector<IFile> clist = folder.getAllComponent();
		//todo:遍历之前可以对clist进行排序,这些都不是重点 
		for( Iterator<IFile> it = clist.iterator() ; it.hasNext() ; )
		{
			IFile em = it.next();
			if( em instanceof Folder )
			{
				Folder cm = (Folder)em;
				System.out.println( getIndents( em.getDeep() ) + cm.getName() );
				iterateTree( cm );
			}
			else
			{
				System.out.println( getIndents( em.getDeep() ) + ( (File)em ).getName() );
			}
		}
	}
	
	/** 
	 * 文件层次缩进字符串 
	 * 
	 * @param x 缩进字符个数 
	 * @return 缩进字符串 
	 */
	public static String getIndents(
			int x )
	{
		StringBuilder sb = new StringBuilder();
		for( int i = 0 ; i < x ; i++ )
		{
			sb.append( indentChar );
		}
		return sb.toString();
	}
}


输出结果:


树根
	1_枝1
	1_枝2
		2_枝1
		2_枝2
		2_叶1
	1_叶1
	1_叶2
	1_叶3
	1_枝3


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合成模式代码示例 的相关文章

  • redis是否支持事务?

    redis是支持事务的 通过multi开启事务 通过exec提交事务 通过discard取消事务 但是redis的事务是 不支持自动回滚的 在事务中 如果执行了多条命令 有一条执行失败了 其他的命令还是正常执行
  • 【梯度下降算法】{2} ——多元线性回归中的梯度下降法

    此处分析一下多元线性回归模型中的梯度下降法 线性回归模型的损失函数 即使是对于样本特征数只有1的线性回归中 中也包含两个值 0和 1 梯度下降法的实现过程 代价函数 梯度下降法 当使用梯度下降法求代价函数函数最小值的时候 有时要对目标函数进
  • eclipse工作空间配置--------新建菜单初始项

    当我们新建new时 找不到我们所需要的新建选项每次都在other里面搜索很是麻烦 我们可以配置菜单的初始项 让新建菜单栏展示我们常用的选项 去掉不用的 下面以Folder为例子 首先查看新建菜单栏初始项发现没有Folder other查看所
  • 自定义VLC播放器 C#实现(一)

    1 Vlc DotNet Forms实现 实现方式 1 通过Nuget工具下载Vlc DotNet Forms包 2 在窗体中载入VlcControl控件 3 设置vlcControl的VlcLibDirectory属性 此属性指向 lib
  • IDEA 使用commit之后一闪而过 没有错误也没有警告

    1 选择行分隔符为CRLF 为windows的utf 8 2 在设置 代码样式 行分隔符中也如上选择 点击应用 3 在设置 文件编码中 如图这三个地方也选择utf 8 点击应用 4 重启IDEA即可 参考链接 https blog csdn
  • upload-labs靶场-Pass-05关-思路以及过程

    开始前的小准备 upload labs靶场 是PHP环境运行的 所以我准备了一个PHP脚本和一张图片 图片好准备 PHP脚本如果不想写的话可以用我的这个获取当前时间的PHP脚本 图片默认不清楚放大看 Pass 05 代码 is upload
  • CVPR 2020

    性能优于PDA MDA和SWDA等网络 作者团队 北京航空航天大学 1 引言 近年来 在基于深度学习的目标检测中见证了巨大的进步 但是 由于domain shift问题 将现成的检测器应用于未知的域会导致性能显著下降 为了解决这个问题 本文
  • Web自动化测试08:Selenium—键盘操作

    更多功能测试以及全套学习路线图均在专栏 戳进去领取 Web自动化测试01 认识web自动化在什么项目中适用 Web自动化测试02 Web自动化测试工具选择大全 Web自动化测试03 Selenium安装配置 详细教程 Web自动化测试04
  • spring bean实例化的三种方法

    文章目录 前言 代码结构 一 构造方法实例化bean 实用 1 代码 2 运行结果 3 实例化说明 二 使用静态工厂实例化bean 了解 1 代码 2 运行结果 3 实例化说明 三 使用实例工厂实例化bean 了解 1 代码 2 运行结果
  • 搭建Freekan私人影视电影网站,cpolar内网穿透发布上线

    文章目录 1 前言 2 本地网页搭建 2 1 环境使用 2 2 支持组件和环境设置 2 3 支持组件选和环境设置 2 4 网页安装 2 5 测试和使用 2 6 问题解决 3 本地网页发布 3 1 Cpolar云端设置 3 2 Cpolar本
  • CUDA 线程执行模型分析(一)招兵------ GPU的革命

    CUDA 线程执行模型分析 一 招兵 GPU 的革命 序 或许看到下面的内容的时候 你会觉得和传统的讲解线程 和一些讲解计算机的书的内容不是很相同 我倒觉得有关计算机 编程这些方面的内容 并不都是深奥难懂的 再深奥难懂的事情 其实本质上也是
  • 计算机信息技术的具体应用案例,信息技术应用 用计算机画函数图象教学设计案例...

    徐敏 地区 北京市 北京市 海淀区 学校 北京市永定路中学 共1课时 信息技术应用 用计算机画函数图象 gt 信息技术应用 用计算机 初中数学 人教2011课标版 1教学目标 知识目标 1 理解一次函数和正比例函数的概念 2 根据实际问题列
  • spring boot 整合 swagger2,并设置post,get请求方式

    1 pom添加依赖
  • TCP协议常见的端口

    服务器的端口分类很多 如果根据所提供的服务方式来划分 服务器端口可分为 TCP协议端口 和 UDP协议端口 两种 而采用TCP协议的是一种直接与接收方进行的连接 发送信息以后 可以确认信息是否到达的方式 随着计算机网络技术的不断进步与发展
  • 成功解决:AssertionError: Torch not compiled with CUDA enabled

    在运行pycharm项目的时候 出现了以上的报错 主要可以归结于以下两个个方面 1 没有安装GPU版本的pytorch 只是使用清华的镜像地址下载了CPU版本的pytorch 2 安装的CUDA和安装的pytorch的版本不相互对应 我使用
  • Qt实现多窗体编程

    在学习多窗体编程时 遇到许多的问题以及错误 对搜到的教程一知半解并且遇到好多的将源码放到csdn下载上这种让人很难受的操作 因此写下此博客 记录一下遇到的问题 一 新建窗体 首先 多窗体编程意味着你必须有两个或更多的窗体 因此需要新建窗体
  • 从gitLab拉取java项目

    1 配置好git 百度安装 2 下载代码 2 1在本地文件夹中建个目录 然后文件夹中空白地方右键 选择 git bash here 2 2 在git中执行 git clone b main http git lab com ywdj bac
  • windows 打开方式 其他程序不可用

    文章目录 HKEY CURRENT USER Software Microsoft Windows CurrentVersion Explorer FileExts doc 此处对应当前的文件后缀 此处以 doc为例 删除 OpenWith
  • exchange删除邮件

    一 批量删除特定主题的邮件1 1 批量删除所有数据库中特定主题的邮件1 群发了几封主题为 backup 的邮件 2 当前操作账号需要满足如下需求 a 该账号需属于Exchange Server 管理员角色以及源服务器和目标服务器的本地 Ad
  • (三)克隆CentOS7虚拟机,并配置网络环境

    文章目录 1 配置好一个配置好网络环境的虚拟主机 2 设置一个快照 3 开始克隆虚拟主机 4 配置克隆后的虚拟主机的网卡 4 1 配置服务器主机别名 4 2 添加映射关系 4 3 配置ip地址 4 3 1 先查看网卡情况 4 3 2 激活网

随机推荐

  • linux复制粘贴技巧

    目录 一 文件复制 二 文字复制 总结 一 文件复制 虚拟机文件复制需要安装VMware Tools工具 虚拟机中的VMware Tools安装位置如下 具体安装操作见其他文章 拖拽方式实现 鼠标左键按住虚拟机的文件夹或文件 移动鼠标到主机
  • java水仙花数(详解)

    水仙花数 就是 有一个三位数 它的每一位上的数字的平方的和等于它本身 例如 153 1 1 5 5 3 3 也就是int i a a a b b b c c c 底层逻辑清楚了 代码也就清楚了 如下 public class shuixia
  • idea服务器与项目连接数据库连接,idea和服务器连接数据库连接

    idea和服务器连接数据库连接 内容精选 换一换 用户通过psycopy2连接GaussDB for openGauss 服务器时 可以通过开启SSL加密客户端和服务器之间的通讯 在使用SSL时 默认用户已经获取了服务端和客户端所需要的证书
  • 浅析互联网+的定义及核心

    互联网 和O2O在本质上十分接近 都是强调互联网 Online 与实体经济 Offline 融合互动并促进后者的转型升级 但 互联网 被赋予了更广的意义 从现状来看 互联网 处于初级阶段 是个都在热谈但是没有落实的理论阶段 各领域针对 互联
  • 基础数学知识

    1 希尔伯特空间是欧几里得空间的推广 即希尔伯特空间不再局限于有限维的情形而是无限维的欧几里得空间 向量内积 点乘 和外积 叉乘 的区别 https www cnblogs com gxcdream p 7597865 html 2 张量积
  • transE

    文章来源 http chuansong me n 2553541 我们为什么要关注表示学习这个问题呢 我们可以看关于机器学习的一个重要公式 这个公式有三个部分组成 第一部分是关于数据或者问题的表示 在表示的基础上我们要去设计或者构建一个目标
  • c++中的智能指针unique_ptr中get()的用法

    bar是一个智能指针 p是一个普通指针 p bar get 后 bar并非被释放 也就相当于指针p和智能指针bar共同管理一个对象 所以就 p做的一切 都会反应到bar指向的对象上
  • python实现人脸关键部位检测(附源码)

    人脸特征提取 本文主要使用dlib库中的人脸特征识别功能 dlib库使用68个特征点标注出人脸特征 通过对应序列的特征点 获得对应的脸部特征 下图展示了68个特征点 比如我们要提 取眼睛特征 获取37到46这几个特征点即可 在代码中增加类似
  • 非对称式加密(RSA算法案例)

    一 非对称式加密 非对称密码指的是加密和解密使用的不是相同的钥匙 用户A密钥加密后的信息只有他自己用解密密钥才能解密 如果知道了其中一个密钥 并不能计算另一个 因此公开一对密钥中的一个 并不会危害到另一个的秘密性质 我们将公开是密钥称为公钥
  • Altium Designer 3D封装下载及导入教程

    本帖最后由 绝影 于 2013 9 27 17 01 编辑 首先 先晒几个图 是不是很逼真啊 教程 我们常用的3D封装可以在这个网站下载 http www 3dcontentcentral cn Search aspx arg 0805 下
  • csharp: Data binding in WPF DataGrid control

  • docker - 安装(ubuntu20.04+cuda11.1)

    docker安装 ubuntu20 04 1 安装docker 替换国内源 apt get install vim 安装vim编辑器 vim etc apt sources list 编辑源文件 删掉内容 换成以下的国内源 添加阿里源 de
  • 算法笔记——二分查找

    算法笔记 二分查找 二分查找 用于在有序数列中查找目标元素的位置 关于区间边界的问题 二分法 区间的定义一般为两种 左闭右闭即 left right 或者左闭右开即 left right 左闭右闭 while left lt right 要
  • Tcpdump抓包实操

    文章目录 1 常用命令 抓取一个固定主机ip的端口号 并保存在本地 后台抓取多个主机的数据包 按抓包的时间保存数据包 2 自定义操作 自定义网络接口 自定义端口 自定义抓取数据包的个数 自定义指定协议 参考链接 刚从wireshark转到t
  • Python遇见的AttributeError: module 'random' has no attribute 'uniform'问题

    在使用python的random库的时候出现了以下错误 Traceback most recent call last File F python脚本 random py line 1 in
  • Nacos 开源版的使用测评

    文章目录 一 Nacos的使用 二 Nacos和Eureka在性能 功能 控制台体验 上下游生态和社区体验的对比 三 记使使用Nacos中容易犯的错误 四 对Nacos开源提出的一些需求 一 Nacos的使用 这里配置mysql的连接方式
  • PicList 文件上传+云存储管理工具

    前言 PicGo是一个非常好的图片上传工具 对于写博客的人来说十分实用 但我在使用的时候 发现了一些痛点 比如图片上传后 无法在相册内云同步删除 这样需要更换图片的时候就比较麻烦 另外PicGo不能获取使用软件前上传的图片列表 也不太方便
  • Redis订阅了一段时间后订阅失效了( redisTemplate.convertAndSend)

    有时候 有些服务长时间运行后 对redis的订阅失效了 但是只要重启服务器又可以了 这个原因如下 引起这一原因是redis conf中的tcp keepalive影响的 这个配置默认是0 官方建议值为60 单位是秒 此配置的作用是检查健康的
  • 【持续更新】Markdown中数学公式及符号整理

    Markdown中数学公式及符号整理 在写博客 写文档中经常需要编辑各种形式的数学公式 对于简单的公式 可以在word中编辑 对于复杂的公式一般以截图 粘贴的方式 利用Markdown中的LaTeX插件 公式均以代码形式编辑 写文档时十分方
  • 合成模式代码示例

    package com example hecheng public interface IFile 返回自己的实例 IFile getComposite 某个商业方法 void sampleOperation 获取深度 int getDe