Go和Java实现组合模式

Go和Java实现组合模式

我们通过部门和员工的层次结构的示例来演示组合模式的用法。

1、组合模式

组合模式,又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对

象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

  • 意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用

    具有一致性。

  • 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一

    样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

  • 何时使用:1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的

    不同,用户将统一地使用组合结构中的所有对象。

  • 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

  • 关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

  • 应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作数也可以是操作数、操作

    符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

  • 优点:1、高层模块调用简单。 2、节点自由增加。

  • 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

  • 使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。

  • 注意事项:定义时为具体类。

  • 适用性:

    你想表示对象的部分-整体层次结构。

    你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

2、Go实现组合模式

package composite// ==========Employer(员工)==========
type Employer interface {// 新增员工Add(Employer)// 删除员工Delete(Employer)// 打印员工信息PrintInfo()
}
package compositeimport "fmt"// ==========ProjectManager(项目经理)==========
type ProjectManager struct {Name      stringEmployers []Employer
}// 新增员工
func (projectManager *ProjectManager) Add(employer Employer) {projectManager.Employers = append(projectManager.Employers, employer)
}// 删除员工
func (projectManager *ProjectManager) Delete(employer Employer) {for i := 0; i < len(projectManager.Employers); i++ {if projectManager.Employers[i] == employer {projectManager.Employers = append(projectManager.Employers[:i], projectManager.Employers[i+1:]...)}}
}// 打印员工信息
func (projectManager *ProjectManager) PrintInfo() {// 可以打印项目助理和程序员的信息fmt.Println("ProjectManager PrintInfo:")for _, employer := range projectManager.Employers {switch emp := employer.(type) {case *Programmer:fmt.Println("Programmer:", emp.Name)case *ProjectAssistant:fmt.Println("ProjectAssistant:", emp.Name)}}
}
package compositeimport "fmt"// ==========ProjectAssistant(项目助理)==========
type ProjectAssistant struct {Name      stringEmployers []Employer
}// 新增员工
func (projectAssistant *ProjectAssistant) Add(employer Employer) {projectAssistant.Employers = append(projectAssistant.Employers, employer)
}// 删除员工
func (projectAssistant *ProjectAssistant) Delete(employer Employer) {for i := 0; i < len(projectAssistant.Employers); i++ {if projectAssistant.Employers[i] == employer {projectAssistant.Employers = append(projectAssistant.Employers[:i], projectAssistant.Employers[i+1:]...)}}
}// 打印员工信息
func (projectAssistant *ProjectAssistant) PrintInfo() {// 可以打印程序员的信息fmt.Println("ProjectAssistant PrintInfo:")for _, employer := range projectAssistant.Employers {switch emp := employer.(type) {case *Programmer:fmt.Println("Programmer:", emp.Name)}}
}
package composite// ==========Programmer(程序员)==========
type Programmer struct {Name      stringEmployers []Employer
}// 新增员工
func (programmer *Programmer) Add(employer Employer) {
}// 删除员工
func (programmer *Programmer) Delete(employer Employer) {
}// 打印员工信息
func (programmer *Programmer) PrintInfo() {
}
package mainimport (. "proj/composite"
)func main() {// ==========项目经理==========cpm := ProjectManager{Name: "项目经理"}// ==========项目助理==========cpa := &ProjectAssistant{Name: "项目助理"}// ==========程序员一==========cp1 := &Programmer{Name: "程序员一"}// ==========程序员二==========cp2 := &Programmer{Name: "程序员二"}// 项目经理添加项目助理cpm.Add(cpa)// 项目经理添加程序员cpm.Add(cp1)cpm.Add(cp2)cpm.PrintInfo()// 删除程序员二cpm.Delete(cp2)cpm.PrintInfo()
}
# 输出
ProjectManager PrintInfo:
ProjectAssistant: 项目助理
Programmer: 程序员一
Programmer: 程序员二
ProjectManager PrintInfo:
ProjectAssistant: 项目助理
Programmer: 程序员一

3、Java实现组合模式

package com.composite;import java.util.List;// ==========Employer(员工)==========
public abstract class Employer {public String name;public List<Employer> employers;public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Employer> getEmployers() {return employers;}public void setEmployers(List<Employer> employers) {this.employers = employers;}// 新增员工public void add(Employer employer) {employers.add(employer);}// 删除员工public void delete(Employer employer) {employers.remove(employer);}// 打印员工信息public abstract void printInfo();}
package com.composite;import java.util.ArrayList;// ==========ProjectManager(项目经理)==========
public class ProjectManager extends Employer  {public ProjectManager(String name) {setName(name);employers = new ArrayList<>();}// 打印员工信息@Overridepublic void printInfo() {// 可以打印项目助理和程序员的信息System.out.println("ProjectManager PrintInfo:");for(Employer employer :employers){if (employer instanceof ProjectAssistant){System.out.println("ProjectAssistant:" + employer.getName());}else if (employer instanceof Programmer){System.out.println("Programmer:" + employer.getName());}}}
}
package com.composite;import java.util.ArrayList;// ==========ProjectAssistant(项目助理)==========
public class ProjectAssistant  extends Employer{public ProjectAssistant(String name) {setName(name);//项目助理,表示没有下属了employers = new ArrayList<>();}// 打印员工信息@Overridepublic void printInfo() {// 可以打印程序员的信息System.out.println("ProjectAssistant PrintInfo:");for(Employer employer:employers){if (employer instanceof Programmer){System.out.println("Programmer:" + employer.getName());}}}
}
package com.composite;// ==========Programmer(程序员)==========
public class Programmer extends Employer  {public Programmer(String name) {setName(name);//程序员,,表示没有下属了employers = null;}// 新增员工@Overridepublic void add(Employer employer) {}// 删除员工@Overridepublic void delete(Employer employer) {}// 打印员工信息@Overridepublic void printInfo() {}
}
package com.composite;public class Test {public static void main(String[] args) {// ==========项目经理==========Employer pm = new ProjectManager("项目经理");// ==========项目助理==========Employer pa = new ProjectAssistant("项目助理");// ==========程序员一==========Employer programmer1 = new Programmer("程序员一");// ==========程序员二==========Employer programmer2 = new Programmer("程序员二");// 项目经理添加项目助理pm.add(pa);// 项目经理添加程序员pm.add(programmer1);pm.add(programmer2);pm.printInfo();// 删除程序员二pm.delete(programmer2);pm.printInfo();}
}
# 输出
ProjectManager PrintInfo:
ProjectAssistant:项目助理
Programmer:程序员一
Programmer:程序员二
ProjectManager PrintInfo:
ProjectAssistant:项目助理
Programmer:程序员一

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

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

相关文章

【MFC】03.常用复杂控件的使用-笔记

热键&#xff1a; 对话框-类向导&#xff1a;初始化函数中&#xff0c;热键需要在最开始的时候就注册进去&#xff1a; 注册热键&#xff1a; 在这之前&#xff0c;先去定义一个宏&#xff0c;代表你这个快捷键。 参数&#xff1a;窗口句柄&#xff0c;热键编号&#xff08;热…

antd vue中遍历v-for中控制每个按钮的loading

项目中遇到一个需求&#xff0c;需要根据后台返回数据&#xff0c;遍历生成多个按钮&#xff0c;并点击出发事件。点击事件的时候需要该按钮loading状态。实现方法如下&#xff1a; <div class"center"><a-button v-for"(item,index) in btnItems&quo…

C# File.Exists与Directory.Exists用法

File.Exists&#xff1a; 用于检查给定文件路径是否存在。如果文件存在&#xff0c;则返回true&#xff0c;否则返回false。 string path“D:\\test\\example.txt” bool exists File.Exists(path); if (exists) {Console.WriteLine("File exists."); } else {Con…

Qt 实现压缩文件、文件夹和解压缩操作zip

一、实现方式 通过Qt自带的库来实现&#xff0c;使用多线程方式&#xff0c;通过信号和槽来触发压缩与解压缩&#xff0c;并将压缩和解压缩结果回传过来。 使用的类&#xff1a; #include "QtGui/private/qzipreader_p.h" #include "QtGui/private/qzipwriter…

HCIP入门静态实验

题目及要求 第一步&#xff1a;拓扑的搭建 第二步&#xff1a;路由、IP的配置 r1: <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys r1 [r1]int loop [r1]int LoopBack 0 [r1-LoopBack0]ip add 192.168.1.65 27 [r1-LoopBack0]int loop 1 […

什么是高级持续威胁(APT)攻击

目录 前言什么是高级持续威胁高级持续威胁攻击有哪些独特特征APT攻击的五个阶段APT检测及防护措施总结 前言 APT攻击是利用多个阶段和不同攻击技术的复合网络攻击。APT不是一时兴起构思或实施的攻击。相反&#xff0c;攻击者故意针对特定目标定制攻击策略。并在较长时间内进行…

接口测试如何在json中引用mock变量

在测试接口的时候&#xff0c;有的接口需要测试随机传入大量数据&#xff0c;查看数据库是否正常&#xff0c;但是大量的随机数据全靠自己手写会很慢&#xff0c;而且是通过json传递的数据。 这里我们就可以使用mock生成随机变量&#xff0c;然后在json中引用mock变量 首先看…

python与深度学习(十四):CNN和IKUN模型二

目录 1. 说明2. IKUN模型的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章猫狗大战训练的模型进行测试。…

Netty+springboot开发即时通讯系统笔记(一)

业务部分从sql开始&#xff1a; /*Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 50740Source Host : localhost:3306Source Schema : im-coreTarget Server Type : MySQLTarge…

极客时间:如何成为学习高手 【学习笔记】

本文是 极客时间- 如何成为学习高手 - 高冷冷 专栏学习笔记整理&#xff0c;课程链接&#xff1a;https://time.geekbang.org/column/intro/100081501?tabcatalog 底层思维01&#xff5c;如何减少对学习的排斥和厌恶心理&#xff0c;使其变得相对愉悦&#xff1f;02&#xff…

20天学rust(一)和rust say hi

关注我&#xff0c;学习Rust不迷路 工欲善其事&#xff0c;必先利其器。第一节我们先来配置rust需要的环境和安装趁手的工具&#xff0c;然后写一个简单的小程序。 安装 Rust环境 Rust 官方有提供一个叫做 rustup 的工具&#xff0c;专门用于 rust 版本的管理&#xff0c;网…

windows下载安装FFmpeg

FFmpeg是一款强大的音视频处理软件&#xff0c;下面介绍如何在windows下下载安装FFmpeg 下载 进入官网: https://ffmpeg.org/download.html, 选择Windows, 然后选择"Windows builds from gyan.dev" 在弹出的界面中找到release builds, 然后选择一个版本&#xff0…

Day09-ES6编程

文章目录 Day09-ES6编程一 Map集合1 Map集合的特点2 基本语法3 遍历4 应用二 DEBUG第一步 打断点第二步 启动DEBUG模式第三步,让程序执行下一步第四步,结束DEBUG模式三 对象中的函数四 this的指向问题1 普通函数中的this2 对象的普通函数中的this3 事件绑定函数的this4 箭头函数…

Java面向对象之import关键字

import关键字 为使用定义在不同包中的Java类&#xff0c;需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。语法格式&#xff1a;import 包名. 类名;在源文件中使用import显式的导入指定包下的类或接口。声明在包的声明和类的声…

区块链实验室(13) - 在PBFT中节点的度与其流量的特征

前面若干实验说明了PBFT的耗时、流量与度的特征&#xff0c;见 区块链实验室(10) - 实例说明PBFT的共识过程, 区块链实验室(11) - PBFT耗时与流量特征, 区块链实验室(12) - 网络拓扑对PBFT共识流量的影响 同样的实验方案&#xff0c;在100个节点构成的无标度网络中完成100次交…

c++游戏制作指南(二):制作一个炫酷的启动界面(c++绘图)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

缺失数字,给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

题记&#xff1a; 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; 输入&#xff1a;nums [3,0,1] 输出&#xff1a;2 解释&#xff1a;n 3&#xff0c;因为有 3 个数字&#xff0c;所以所有的…

ChatGPT辅助写论文:提升效率与创造力的利器

写作是人类最重要的交流方式之一&#xff0c;也是学术研究中不可或缺的环节。然而&#xff0c;写作并不是一件容易的事情&#xff0c;尤其是对于科研人员来说&#xff0c;他们需要花费大量的时间和精力来撰写高质量的论文&#xff0c;并且面临着各种各样的挑战&#xff0c;如语…

【Spring Boot】请求参数传json对象,后端采用(map)CRUD案例(101)

请求参数传json对象&#xff0c;后端采用&#xff08;map&#xff09;接收的前提条件&#xff1a; 1.Spring Boot 的Controller接受参数采用&#xff1a;RequestBody 2.需要一个Json工具类&#xff0c;将json数据转成Map&#xff1b; 工具类&#xff1a;Json转Map import com…

一文了解JavaScript 与 TypeScript的区别

TypeScript 和 JavaScript 是两种互补的技术&#xff0c;共同推动前端和后端开发。在本文中&#xff0c;我们将带您快速了解JavaScript 与 TypeScript的区别。 一、TypeScript 和 JavaScript 之间的区别 JavaScript 和 TypeScript 看起来非常相似&#xff0c;但有一个重要的区…