组合的示例代码 java_java实现Composite组合模式的实例代码

//20210121

写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现组合模式

组合模式核心思想类似文件夹的概念,构件树形结构,树形有叶子结点和文件夹结点,文件夹结点可以包含叶子结点和文件夹结点

分为两种模式

- 透明型:所有节点构造全部相同,但是由于叶子结点没有下层结点,所以其有些方法为空,会不安全

- 安全型:叶子结点和文件架节点构造不同,这样展示的时候需要判断节点属性,不方便调用,但是由于没有空方法,会很安全

透明型组合模式程序源代码:

//节点抽象父类

/**

* 透明模式就是把组合使用的方法放到抽象类中,不管叶子对象还是数值对象都有相同的结构

* 这样做的好处就是叶子结点和树枝结点对于外界没有区别,他们具备完全一致的行为接口

*/

public abstract class ComponentTransparent {

protected String name;

public ComponentTransparent(String name){

this.name = name;

}

//增加一个叶子构件或者树枝构件

public abstract void add(ComponentTransparent componentTransparent);

//删除

public abstract void remove(ComponentTransparent componentTransparent);

//获取分支下的所有叶子构件和树枝构件

public abstract void display(int depth);

}

//文件架节点实现子类

import java.util.ArrayList;

public class CompositeTransparent extends ComponentTransparent{

public CompositeTransparent(String name){

super(name);

}

//构建容器

private ArrayList componentTransparentsArraylist= new ArrayList<>();

@Override

public void add(ComponentTransparent componentTransparent) {

this.componentTransparentsArraylist.add(componentTransparent);

}

@Override

public void remove(ComponentTransparent componentTransparent) {

this.componentTransparentsArraylist.remove(componentTransparent);

}

@Override

public void display(int depth) {

//输出树形结构

for (int i = 0;i

System.out.print("-");

}

System.out.println(this.name);

//下级遍历

for(ComponentTransparent componentTransparent:this.componentTransparentsArraylist){

componentTransparent.display(depth+1);

}

}

}

//叶子节点实现子类

public class LeafTransparent extends ComponentTransparent{

public LeafTransparent(String name){

super(name);

}

@Override

public void add(ComponentTransparent componentTransparent) {

//空实现,抛出"不支持请求"异常

throw new UnsupportedOperationException();

}

@Override

public void remove(ComponentTransparent componentTransparent) {

throw new UnsupportedOperationException();

}

@Override

public void display(int depth) {

//输出树形结构的叶子节点

for (int i = 0;i

System.out.print("-");

}

System.out.println(this.name);

}

}

安全型组合模式源代码:安全型中,叶子结点没有增加移除方法,方法需要自己实现,而不会在父类中指出

//节点抽象父类

public abstract class ComponentSafty {

protected String name;

public ComponentSafty(String name){

this.name = name;

}

//展示

public abstract void display(int depth);

}

//文件夹节点实现子类

import java.util.ArrayList;

public class CompositeSafty extends ComponentSafty{

public CompositeSafty(String name){

super(name);

}

private ArrayList componentSaftyArrayList = new ArrayList<>();

public void add(ComponentSafty component){

this.componentSaftyArrayList.add(component);

}

public void remove(ComponentSafty componentSafty){

this.componentSaftyArrayList.remove(componentSafty);

}

@Override

public void display(int depth) {

for (int i=0;i

System.out.print("-");

}

System.out.println(this.name);

for (ComponentSafty componentSafty : componentSaftyArrayList) {

componentSafty.display(depth+1);

}

}

}

//叶子结点实现子类

public class LeafSafty extends ComponentSafty{

public LeafSafty(String name){

super(name);

}

@Override

public void display(int depth) {

for (int i=0;i

System.out.print("-");

}

System.out.println(this.name);

}

}

测试主类程序源代码

//测试主类

public class Main {

private static void transparent(){

//创建根节点以及其子节点

ComponentTransparent root = new CompositeTransparent("root");

root.add(new LeafTransparent("Leaf A"));

root.add(new LeafTransparent("Leaf B"));

//创建第二层结点及其子节点

ComponentTransparent branch = new CompositeTransparent("Composite X");

branch.add(new LeafTransparent("Leaf XA"));

branch.add(new LeafTransparent("Leaf XB"));

root.add(branch);

//创建第三层节点及其子结点

ComponentTransparent branch2 = new CompositeTransparent("Composite XY");

branch2.add(new LeafTransparent("Leaf XYA"));

branch2.add(new LeafTransparent("Leaf XYB"));

branch.add(branch2);

//创建第二层结点

root.add(new LeafTransparent("Leaf C"));

//常见第二层节点并删除

ComponentTransparent leaf = new LeafTransparent("Leaf D");

root.add(leaf);

root.display(1);

root.remove(leaf);

for(int i =0;i<10;++i){

System.out.print("=");

}

System.out.println();

//展示

root.display(1);

}

private static void safty(){

//创建根节点以及其子节点

CompositeSafty root = new CompositeSafty("root");

root.add(new LeafSafty("Leaf A"));

root.add(new LeafSafty("Leaf B"));

//创建第二层结点及其子节点

CompositeSafty branch = new CompositeSafty("Composite X");

branch.add(new LeafSafty("Leaf XA"));

branch.add(new LeafSafty("Leaf XB"));

root.add(branch);

//创建第三层节点及其子结点

CompositeSafty branch2 = new CompositeSafty("Composite XY");

branch2.add(new LeafSafty("Leaf XYA"));

branch2.add(new LeafSafty("Leaf XYB"));

branch.add(branch2);

//创建第二层结点

root.add(new LeafSafty("Leaf C"));

//常见第二层节点并删除

LeafSafty leaf = new LeafSafty("Leaf D");

root.add(leaf);

root.display(1);

root.remove(leaf);

for(int i =0;i<10;++i){

System.out.print("=");

}

System.out.println();

//展示

root.display(1);

}

public static void main(String[] args) {

System.out.println("透明模式:");

transparent();

for(int i =0;i<10;++i){

System.out.print("=");

}

System.out.println();

System.out.println("安全模式:");

safty();

}

}

输出如下:

d95185b5c9999ee31c5314c2827b6fd7.png

到此这篇关于java实现Composite组合模式的文章就介绍到这了,更多相关java组合模式内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的ThreadPoolExecutor类

转载自 Java中的ThreadPoolExecutor类在前面的文章中&#xff0c;我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&…

webpack 前端构建

一、建立简单的项目目录 1、创建 manager 根目录(作为项目根目录)2、执行 npm init&#xff0c;在根目录manager下自动生成 package.json文件3、npm install webpack --save-dev&#xff0c;在项目中安装 webpack npm包4、在根目录下 创建 webpack.config.js&#xff0c;所有的…

简析 .NET Core 构成体系

简析 .NET Core 构成体系Roslyn 编译器RyuJIT 编译器CoreCLR & CoreRTCoreFX(.NET Core Libraries).NET Core 代码开发、部署、运行过程总结 前文介绍了.NET Core 在整个.NET 平台所处的地位&#xff0c;以及与.NET Framework的关系(原文链接)&#xff0c;本文将详细介绍.N…

判断一个男人穷还是富,只看这几点!

转载至&#xff1a; 来源&#xff1a;甜蜜爸妈手记&#xff08;wxtm01&#xff09; 作者&#xff1a;甜甜妈 创业君 导读 千主意万主意&#xff0c;如果不行动&#xff0c;永远就只是个想法而已。好想法要配得上行动才行。 看看他的爱好一个有事业心男人&#xff0c;绝对不…

php制作留言板的题_PHP实现留言板功能实例代码

本文实例为大家分享了php留言板的实现思路&#xff0c;供大家参考&#xff0c;具体内容如下&#xff1a;1.创建一个存放留言信息的文件名2.获取表单中的数据给一个变量3.判断文件的时候存在4.对文件执行写的操作&#xff0c;在这之前&#xff0c;注意打开文件的时候&#xff0c…

Java线程池,从使用到原理

转载自 Java线程池&#xff0c;从使用到原理线程池的技术背景 在面向对象编程中&#xff0c;创建和销毁对象是很费时间的&#xff0c;因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此&#xff0c;虚拟机将试图跟踪每一个对象&#xff0c;以便能够在对象销毁…

聊聊HTTPS和SSL/TLS协议

要说清楚 HTTPS 协议的实现原理&#xff0c;至少需要如下几个背景知识。1. 大致了解几个基本术语&#xff08;HTTPS、SSL、TLS&#xff09;的含义2. 大致了解 HTTP 和 TCP 的关系&#xff08;尤其是“短连接”VS“长连接”&#xff09;3. 大致了解加密算法的概念&#xff08;尤…

php事件编程,PHP相应button中onclick事件的案例分析

PHP相应button中onclick事件的案例分析发布时间&#xff1a;2020-11-10 11:28:31来源&#xff1a;亿速云阅读&#xff1a;71作者&#xff1a;小新小编给大家分享一下PHP相应button中onclick事件的案例分析&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给…

Java 中Timer和TimerTask 定时器和定时任务使用的例子

转载自 Java 中Timer和TimerTask 定时器和定时任务使用的例子 这两个类使用起来非常方便&#xff0c;可以完成我们对定时器的绝大多数需求 Timer类是用来执行任务的类&#xff0c;它接受一个TimerTask做参数 Timer有两种执行任务的模式,最常用的是schedule,它可以以两种方式执…

复制一个5G文件只需要两秒,全网最牛方法!

文章来至 微信公众号&#xff1a;中国黑客联盟 很多时候我们在复制比较大的文件的时候是一件多么痛苦的事情&#xff0c;因为少的几分钟多则十几分钟&#xff0c;这样的等待是我们无法容忍的&#xff01;那么今天我们就教大家如何快速的复制电脑大文件&#xff01; 首先我…

.NET Core也可以使用MongoDB了

可能是由于.NET Core还不是正式版的缘故吧&#xff0c;MongoDB的官方Driver(http://mongodb.github.io/mongo-csharp-driver/)一直不支持.NET Core&#xff0c;这给想在.NET Core上尝试MongoDB带来了不便&#xff0c;本人就是其中之一 &#xff1a;&#xff09; 于是Fork了官方…

Java多线程系列--“JUC线程池”06之 Callable和Future

转载自 Java多线程系列--“JUC线程池”06之 Callable和FutureCallable 和 Future 简介Callable 和 Future 是比较有趣的一对组合。当我们需要获取线程的执行结果时&#xff0c;就需要用到它们。Callable用于产生结果&#xff0c;Future用于获取结果。 1. Callable Callable 是…

php array分组,php数组分组简单例子

在php网站开发过程中有时候需要把结果集进行分组&#xff0c;使用php的内置函数array_chunk就可以实现 代码如下复制代码$teamsarray(1,2,3,4,5,6,7,8,9);$teamsarray_chunk($teams,2);print_r($teams);/*Array([0] > Array([0] > 1[1] > 2)[1] > Array([0] > 3…

SuperSocket源码解析之开篇

一 简介 官方介绍&#xff1a;SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作&#xff0c;但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件&#…

Java守护线程概述

转载自 Java守护线程概述Java的线程分为两种&#xff1a;User Thread(用户线程)、DaemonThread(守护线程)。 只要当前JVM实例中尚存任何一个非守护线程没有结束&#xff0c;守护线程就全部工作&#xff1b;只有当最后一个非守护线程结束是&#xff0c;守护线程随着JVM一同结束…

php while循环次数,php while循环得到循环次数

php while循环得到循环次数复制代码 代码如下:$link mysql_connect(localhost,root,pwd);mysql_select_db(db);$sql "select region_id,local_name from regions where region_grade1";$result mysql_query($sql);$i 0;while ($row mysql_fetch_assoc($result)) {…

EntityFramework和EntityFramework.Extended使用说明——性能,语法和产生的sql

环境说明:EntityFramework 6.1.3和.Net Framework4.5性能注意事项:https://msdn.microsoft.com/zh-cn/library/cc853327.aspx比较精髓的一点:查询执行的各个阶段中的准备查询,每个唯一查询一次。包括编写查询命令、基于模型和映射元数据生成命令树和定义所返回数据的形状的成本…

三个水桶(看了三遍,想了五遍!)

转载至&#xff1a;微信公众号&#xff1a; 创业励志网 一 有位木匠砍了一树&#xff0c;把它做了三个木桶。 一个装粪&#xff0c;就叫粪桶&#xff0c;众人躲着&#xff1b; 一个装水&#xff0c;就叫水桶&#xff0c;众人用着&#xff1b; 一个装酒&#xff0c;就叫酒桶&…

nginx解析php失败,为什么nginx不能解析php?

只运行过这些代码yum install -y vim wget zip unzip git httpd php php-mysql php-odbc php-ldap php-gd php-mbstring php-xml php-xml-rpc php-bcmath libjpeg* mariadb ;rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarc…

.NET Core amp; ASP.NET Core 1.0在Redhat峰会上正式发布

众所周知&#xff0c;Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项。这个团队已经一起工作好几个月了,RHEL对.NET有许多需求。今天在RedHat 峰会DevNation 上宣布了.NET Core & ASP.NET Core 1.0 RTM。Red Hat有一个新的关于在…