JAVA SCRIPT设计模式--结构型--设计模式之Composite组合模式(8)

news2024/11/17 7:23:27

         JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了解设计模式目录、原则、设计变化方向,环境相关等信息请查看设计模式开篇。


一、UML类图

参与者:

1.1 Component(Graphic)

  • 为组合中的对象声明接口。
  • 在适当的情况下,实现所有类共有接口的缺省行为。
  • 声明一个接口用于访问和管理Component的子组件。
  • (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

1.2 Leaf(Rectangle、Line、Text等)

  • 在组合中表示叶节点对象,叶节点没有子节点。
  • 在组合中定义图元对象的行为。

1.3 Composite(Picture)

  • 定义有子部件的那些部件的行为。
  • 存储子部件。
  • 在Component接口中实现与子部件有关的操作。

1.4 Client

  • 通过Component接口操纵组合部件的对象。

二、意图

        将对象组合成树形结构以表示“部分 -整体”的层次结构。Composite使得用户对单个对象 和组合对象的使用具有一致性。

三、适用性

  1. 你想表示对象的部分-整体层次结构。
  2. 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

四、示例代码

4.1  动机

        在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表。用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大
的组件。一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container)。

        然而这种方法存在一个问题:使用这些类的代码必须区别对待图元对象与容器对象,而实际上大多数情况下用户认为它们是一样的。对这些类区别使用,使得程序更加复杂。Composite模式描述了如何使用递归组合,使得用户不必对这些类进行区别。

        Composite模式的关键是一个抽象类,它既可以代表图元,又可以代表图元的容器。在图形系统中的这个类就是Graphic,它声明一些与特定图形对象相关的操作,例如Draw。同时它也声明了所有的组合对象共享的一些操作,例如一些操作用于访问和管理它的子部件。子类Line、Rectangle和Text(参见前面的类图)定义了一些图元对象,这些类实现Draw,分别用于绘制直线、矩形和正文。

         Picture类定义了一个Graphic对象的聚合。Picture的Draw操作是通过对它的子部件调用Draw实现的,Picture还用这种方法实现了一些与其子部件相关的操作。由于Picture接口与Graphic接口是一致的,因此Picture对象可以递归地组合其他Picture对象。下图是一个典型的由递归组合的Graphic对象组成的组合对象结构。

     

4.2  示例UML

目录结构:

4.2 Component(Graphic)

export default  class Graphic {
	childrens = [];
    constructor() {
    }
    Draw() {   
		
    }
    Add(graphic) { 
		this.childrens.push(graphic);
    }
	Remove(index) {
		if(index<this.childrens.length)
		   this.childrens.splice(index, 1);
		  // 删除 第一个元素 this.#childrens.splice(0, 1);
		 //第一个参数(0)定义新元素应该被添加(接入)的位置。
		 //第二个参数(1)定义应该删除多个元素。
		 //其余参数被省略。没有新元素将被添加。
	}
	GetChild(index) {
		if(index<this.childrens.length)
			return this.childrens[index];
	}
  }

4.3 Leaf(Rectangle、Line、Text等)

import Graphic  from '../Graphic.js';

export default  class Line extends Graphic {
    constructor() {
		 super();
    }
    Draw() {
		console.log(` Line Draw `);
    }
    
  } 

import Graphic  from '../Graphic.js';

export default  class Rectangle extends Graphic {
    constructor() {
		 super();
    }
   Draw() {
   	    console.log(` Rectangle Draw `);
   }
  } 

import Graphic  from '../Graphic.js';

export default  class Text extends Graphic {
    constructor() {
		 super();
    }
    Draw() {
    	console.log(` Text Draw `);
    }
  } 

4.4 Composite(Picture)


import Graphic  from '../Graphic.js';
export default  class Picture extends Graphic {
    constructor() {
		 super();
    }
    Draw() {
		console.log(` Picture Draw `);
		for(let n=0;n<this.childrens.length;n++)
		{
			let graphic=this.childrens[n];
			graphic.Draw();
		}
    }
    
  } 

4.5 Client

import Graphic  from './Graphic/Graphic.js';
import Picture  from './Graphic/Picture/Picture.js';
import Line  from './Graphic/impl/Line.js';
import Rectangle  from './Graphic/impl/Rectangle.js';
import Text  from './Graphic/impl/Text.js';
 
export default class Client{
    main(){
		

		
	    let apicture =new Picture();//Graphic
		apicture.Add(new Line());
		apicture.Add(new Rectangle());
		apicture.Add(new Text());
		let a2picture =new Picture();//Graphic
		apicture.Add(a2picture);
		a2picture.Add(new Line());
		a2picture.Add(new Text());
		apicture.Draw();
    } 
 }

4.6 测试HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 
 
 <script  type="module" >
 import Client  from './Client.js'; 
 
let cl=new Client();
cl.main()

 </script>
</head>
<body>

    
</body>
</html>

测试结果:


Picture.js:8  Picture Draw 
Line.js:8  Line Draw 
Rectangle.js:8  Rectangle Draw 
Text.js:8  Text Draw 
Picture.js:8  Picture Draw 
Line.js:8  Line Draw 
Text.js:8  Text Draw 

五、源代码下载

        下载链接:https://pan.baidu.com/s/1XuPqp84cccBNVkbnMY3sKw 
         提取码:q2ut

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

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

相关文章

进阶 - Git的Bug分支

本篇文章&#xff0c;是基于我自用Linux系统中的自定义文件夹“test_rep”&#xff0c;当做示例演示 具体Git仓库的目录在&#xff1a;/usr/local/git/test_rep Git的Bug分支 软件开发中&#xff0c;bug 就像家常便饭一样。有了 bug 就需要修复&#xff0c;在 Git 中&#xff…

LabVIEW与工具包版本的不兼容问题

前面的文章有介绍过&#xff0c;LabVIEW可以看做是一种编程语言&#xff0c;同时NI也在LabVIEW里提供了非常多的可快速构建专业应用的工具包模块&#xff0c;这些模块有的是用于专业数据采集的&#xff0c;有的是用于图像处理的&#xff0c;还有的可能是工业控制的。个人觉得这…

记一次InputStream流读取不完整留下的惨痛教训

前言 首先&#xff0c;问问大家下面这段流读取的代码是否存在问题呢&#xff1f; inputStream .... try {// 根据inputStream的长度创建字节数组byte[] arrayOfByte new byte[inputStream.available()];// 调用read 读取字节数组inputStream.read(arrayOfByte, 0, arrayOfB…

计算机毕业设计ssm+vue基本微信小程序的健康管理系统 uniapp 小程序

项目介绍 本文介绍了使用微信小程序技术开发健康管理系统的设计与实现过程,首先对实现该系统的技术进行分析,说明选择Java后台技术和MySQL数据库的必要性,然后对基于微信小程序的健康管理系统的需求进行分析。并接着对系统进行设计,包括架构设计、功能设计、数据库设计。最后进…

基于改进遗传算法把电力系统功率损耗降至最低(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;本科计算机专业&#xff0c;研究生电气学硕…

软件测试用例

测试用例为什么要写测试用例测试用例的基本要素QQ登录的测试用例功能正常时异常时界面易用性可移植性性能具体的设计测试用例的方法等价类边界值错误猜测法场景设计法因果图法正交排列测试用例的有效性为什么要写测试用例 测试用例是测试执行的依据测试用例可以复用&#xff0…

分布式多级缓存

学习就是带着问题前行 缓存是什么&#xff1f; 缓存击穿是什么&#xff1f; 缓存雪崩是什么&#xff1f; 如何保证分布式缓存的数据一致性&#xff1f; 如何进行缓存预热&#xff1f; 如何设计缓存热点探测&#xff1f; 曾经问过一个技术修为很高的朋友&#xff0c;为什么…

系统移植 uboot 1

一、uboot概念 1.1 uboot和bootloader关系 1.bootloader:是一系列引导加载程序的统称 &#xff0c;uboot是其中之一。 1.2 uboot特点 1.uboot是由德国DNEX小组进行维护的 2.uboot是一个开源分布式系统 3.uboot支持多种硬件架构平台(ARM/X86/POWERPC) 4.uboot短小精悍 5.…

飞轮效应,中国企业级SaaS的一次自我革命

“数智飞轮”“客户成功”&#xff0c;三年时间&#xff0c;用友YonSuite终于按下了发展的“快进键”&#xff0c;中国企业级SaaS的产业革命也就此开始。 前不久&#xff0c;用友发布了2022年三季报。在公司战略增强公有云订阅业务的前提下&#xff0c;中型企业云服务业务收入…

模拟电路设计(38)---基于LT1173的负压产生电路

今天来介绍下LT1173在buck&#xff08;step-down&#xff09;模式的工作电路。在介绍PWM电路结构时&#xff0c;有一种形式成为buck型&#xff0c;如下所示&#xff1a; 晶体管开关变换器&#xff08;buck&#xff09;电路 LT1173提供了内置开关管的集电极和发射极管脚&#x…

【图像处理OpenCV(C++版)】——2.2 OpenCV之矩阵运算详解(全)

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

一篇文章让你认识与学习bash(干货满满)

Linux界存在着这样一种说法&#xff1a;“在Linux的环境下&#xff0c;如果你不懂bash是什么&#xff0c;那么其他的东西就不用学了。”bash的学习是所有命令行模式与未来主机维护与管理的重要基础&#xff0c;所以得认真对待。 一.硬件、内核与shell 1.1 什么是shell? 看下图…

Linux下安装mysql5.7.18

查询mysql的安装文件&#xff1a; find / -name mysql有安装mysql的路径&#xff0c;有是存放MySQL安装包的路径 卸载mysql: 删除安装路劲 rm -rf /opt/mysql删除配置文件 rm -rf /etc/my.cnf删除/etc/init.d/下跟mysql有关的全部文件&#xff0c;一般包括mysql文件或mys…

浅尝Go语言的协程实现

文章目录为什么需要协程协程的本质协程如何在线程中执行GMP调度模型协程并发为什么需要协程 协程的本质是将一段数据的运行状态进行打包&#xff0c;可以在线程之间调度&#xff0c;所以协程就是在单线程的环境下实现的应用程序级别的并发&#xff0c;就是把本来由操作系统控制…

微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.1 搜索、分页

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构25 黑马旅游案例25.1 搜索、分页25.1.1 直接开干25 黑马旅游案例 25.1 搜…

PyTorch~自定义数据读取

这次是PyTorch的自定义数据读取pipeline模板和相关trciks以及如何优化数据读取的pipeline等。 因为有torch也放人工智能模块了~ 从PyTorch的数据对象类Dataset开始。Dataset在PyTorch中的模块位于utils.data下。 from torch.utils.data import Dataset围绕Dataset对象分别从…

前端入门必备基础

化繁为简 HTML5要的就是简单、避免不必要的复杂性。HTML5的口号是“简单至上&#xff0c;尽可能简化”。因此&#xff0c;HTML5做了以下改进&#xff1a; 以浏览器原生能力替代复杂的JavaScript代码。 新的简化的DOCTYPE。 新的简化的字符集声明。 简单而强大的HTML5API。…

[附源码]Python计算机毕业设计SSM基于云数据库的便民民宿租赁系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《Linux运维实战:MongoDB数据库全量逻辑备份恢复(方案一)》

一、备份与恢复方案 mongodump是MongoDB官方提供的备份工具,它可以从MongoDB数据库读取数据,并生成BSON文件,mongodump适合用于备份和恢复数据量较小的MongoDB数据库, 不适用于大数据量备份。 默认情况下mongodump不获取local数据库里面的内容。mongodump仅备份数据库中的文档&…

回溯算法(1)组合

文章目录回溯算法理论77. 组合216. 组合总和17. 电话号码的组合回溯算法理论 回溯算法其实就是递归&#xff0c;只不过递归又分为递去和归来&#xff0c;其中归来便就是回溯。 为什么要使用回溯&#xff1f; 有些问题我们通过暴力解法也很难解决&#xff0c;比如说我们接下来…