设计模式学习(四)——《大话设计模式》

设计模式学习(四)——《大话设计模式》

1.泛型

允许在编码时使用类型参数,从而使得代码更加灵活、可重用。泛型可以应用于类、接口、方法中,通过这种方式,可以编写出适用于多种数据类型的通用代码,而不是针对每种数据类型编写重复的代码。

泛型的优势

  • 类型安全:泛型提供编译时类型检查,这意味着你可以在编译阶段就捕获到类型错误,而不是在运行时。
  • 代码重用:通过使用泛型,可以写出更加通用的代码,避免了为每种数据类型编写特定代码的需要。
  • 性能提升:使用泛型可以避免在运行时进行类型转换,因为类型检查是在编译时完成的。这可以提升程序的性能。

泛型在设计模式中的应用

泛型在许多设计模式中都有应用,使得这些设计模式更加灵活和可重用。以下是一些常见设计模式中泛型的应用示例:

工厂模式(Factory Pattern):通过使用泛型,可以创建一个通用的工厂类,它能够返回任何类型的对象。这样就不需要为每种产品创建一个特定的工厂类。
单例模式(Singleton Pattern):虽然单例模式通常不直接使用泛型,但是可以通过泛型来实现一个通用的单例生成器,这样就可以为任何类创建单例实例。
观察者模式(Observer Pattern):通过使用泛型,可以定义一个通用的观察者接口和被观察者对象,使得它们可以处理多种类型的数据。
策略模式(Strategy Pattern):泛型可以使策略模式更加灵活,因为你可以定义一个接受泛型参数的策略接口,从而使得不同的策略实现可以处理不同类型的数据。

代码示例

#Python 3.5 引入了 typing 模块,通过 Type Hints 增加了对泛型的支持。
from typing import TypeVar, GenericT = TypeVar('T')class GenericBox(Generic[T]):def __init__(self, content: T):self.content = contentdef get_content(self) -> T:return self.contentint_box = GenericBox[int](123)
str_box = GenericBox[str]("Hello World")print(f"Integer Value: {int_box.get_content()}")
print(f"String Value: {str_box.get_content()}")
// JDK 5 开始引入了泛型,可以在类、接口、方法中使用泛型。
public class GenericBox<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}public static void main(String[] args) {GenericBox<Integer> integerBox = new GenericBox<>();GenericBox<String> stringBox = new GenericBox<>();integerBox.set(10);stringBox.set("Hello World");System.out.printf("Integer Value :%d\n\n", integerBox.get());System.out.printf("String Value :%s\n", stringBox.get());}
}
//通过使用 void* 指针和函数指针来间接实现类似泛型的效果
#include <stdio.h>// 泛型交换函数
void swap(void *a, void *b, size_t size) {char buffer[size];memcpy(buffer, a, size);memcpy(a, b, size);memcpy(b, buffer, size);
}int main() {int a = 5, b = 10;printf("Before swap: a = %d, b = %d\n", a, b);swap(&a, &b, sizeof(int));printf("After swap: a = %d, b = %d\n", a, b);return 0;
}

2.委托与事件

委托(Delegation)和事件(Events)是实现低耦合、高内聚的设计原则的重要手段。它们允许软件组件以松散耦合的方式相互通信,增强了代码的可维护性和可扩展性。

委托 (Delegation)

委托是一种对象设计模式,允许对象外部的某个方法代表另一个对象来执行任务。这种模式在避免继承带来的复杂性和限制时非常有用,提供了一种灵活的替代方案。

在编程实践中,委托通常意味着将一个方法作为参数传递给另一个方法。这样做的好处是可以在运行时动态地改变方法的行为。

事件 (Events)

事件是一种使对象能够通知其他对象发生了某些事情的机制。当定义的事件发生时,已注册监听该事件的对象会收到通知并执行相应操作。这是观察者模式(Observer Pattern)的一种特殊实现。

事件广泛应用于图形用户界面(GUI)编程和异步编程中,允许应用程序响应用户操作、系统消息或其他触发条件,而无需硬编码所有可能的响应逻辑。

委托与事件在不同语言中的实现

//C# 语言对委托和事件有原生支持。委托是持有一个或多个方法的类型,而事件是基于委托的一种特殊类型,用于实现事件驱动编程
public delegate void MyDelegate(string message); // 委托定义public class Publisher {public event MyDelegate MyEvent; // 事件定义public void RaiseEvent() {MyEvent?.Invoke("Hello World!");}
}public class Subscriber {public void OnMyEvent(string message) {Console.WriteLine(message);}
}// 使用
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
publisher.MyEvent += subscriber.OnMyEvent; // 事件订阅
publisher.RaiseEvent(); // 触发事件
//Java 中没有原生的委托概念,但可以通过接口实现类似的功能。Java 的事件处理通常基于监听器模式,特别是在Swing等GUI框架中。
interface MyListener {void onEventOccurred(String message);
}class Publisher {private List<MyListener> listeners = new ArrayList<>();public void addListener(MyListener listener) {listeners.add(listener);}public void raiseEvent() {for (MyListener listener : listeners) {listener.onEventOccurred("Hello World!");}}
}class Subscriber implements MyListener {@Overridepublic void onEventOccurred(String message) {System.out.println(message);}
}// 使用
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
publisher.addListener(subscriber); // 添加监听器
publisher.raiseEvent(); // 触发事件
#Python 中没有专门的委托和事件关键字,但可以通过函数作为一等公民(first-class citizens)的特性来实现类似的功能。
#事件驱动编程可以通过回调函数和发布/订阅模式来实现。
class Publisher:def __init__(self):self.events = []def subscribe(self, callback):self.events.append(callback)def raise_event(self):for event in self.events:event("Hello World!")def subscriber(event_data):print(event_data)# 使用
publisher = Publisher()
publisher.subscribe(subscriber) # 订阅事件
publisher.raise_event() # 触发事件

3.初学

对软件设计模式中的类与实例、构造方法、方法重载、属性和修饰符、封装、继承、多态、重构、抽象类、集合、接口、泛型、委托与事件等知识进行了初步的学习和了解,后面再继续学习不同的软件设计模式。

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

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

相关文章

如何在CentOS7.x上生成自签名SSL证书

在配置HTTPS连接时&#xff0c;SSL证书是确保数据传输安全性的关键组件。自签名证书是一种不通过证书颁发机构&#xff08;CA&#xff09;签发的证书&#xff0c;适用于测试和内部使用。以下是在CentOS 7.x系统上生成自签名证书的详细步骤。 1. 安装OpenSSL OpenSSL是一个强大…

【嵌入式学习】ARM day04.11

一、思维导图 二、练习 实现三个灯闪烁 汇编代码 .text .global _start _start: 使能GPIOE和F时钟LDR r0,0x50000A28LDR r1,[R0]ORR R1,R1,#(0X3<<4)STR R1,[R0]配置GPIOE和F的MODER寄存器LDR r0,0x50006000 GPIOELDR R1,0X50007000 G…

顶顶通呼叫中心中间件-回铃音补偿(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-回铃音补偿(mod_cti基于FreeSWITCH) 回铃音的用处 回铃音&#xff1a; 当别人打电话给你时&#xff0c;你的电话响铃了&#xff0c;而他听到的声音叫做回铃音。回铃音是被叫方向主叫方传送&#xff0c;也是彩铃功能的基础。我们平时打电话听到的“嘟 嘟…

【C++进阶】C++异常详解

C异常 一&#xff0c;传统处理错误方式二&#xff0c;C处理的方式三&#xff0c;异常的概念四&#xff0c;异常的使用4.1 异常和捕获的匹配原则4.2 函数调用链中异常栈展开匹配原则4.3 异常的重新抛出&#xff08;异常安全问题&#xff09;4.4 RAII思想在异常中的作用 五&#…

C# 设计模式的七大原则详解

文章目录 前言1. 单一职责原则 (SRP)2. 开放封闭原则 (OCP)3. 里氏替换原则 (LSP)4. 依赖倒置原则 (DIP)5. 接口隔离原则 (ISP)6. 合成/聚合复用原则 (CARP)7. 迪米特法则 (LoD) 前言 在 C# 编程中&#xff0c;设计模式的七大原则是保证代码质量和可维护性的基石。这些原则不仅…

2024 Mathorcup高校数学建模挑战赛(B题)| 甲骨文识别 | 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;以CNN卷积神经网络&#xff0c;计算机视觉等强大工具&#xff0c;构建了解决复杂问题的独特方案。深度学习, 混沌模型的妙用&#xff0c;为降低非法野生动物贸易提供新视角。通过综合分析&#xff0c;描…

IP广播对讲系统停车场解决方案

IP广播对讲系统停车场解决方案 一、需求分析 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要停车场系统提高工作效率与服…

mysql数据库基础--基础操作

加 油 1.数据库基础操作 1.1创建数据库 在对数据表中的数据进行任何操作之前&#xff0c;首先必须创建一个数据库。 基本语法结果&#xff1a; create database 新建数据库名;1.2查看数据库 在MySQL中查看数据库的基本语法&#xff1a; show create database 数据库; 1.…

01-Git 之快速入门操作本地仓库

https://learngitbranching.js.org/?localezh_CN在线练习git 1. Git 安装好Git以后, 先检查是否已经绑定了用户名和邮箱 git config --list1.1 为什么要使用版本控制&#xff1f; 从个人角度&#xff1a; 在做项目时&#xff0c;如果一点点去改代码会很乱&#xff0c;不利…

OpenCV4.9更多形态转换

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV4.9处理平滑图像 下一篇:OpenCV4.9更多形态转换 基于这两者&#xff0c;我们可以对图像进行更复杂的转换。在这里&#xff0c;我们简要讨论 OpenCV 提供的 5 个操作&#xff1a; …

FreeBuf 全球网络安全产业投融资观察(3月)

综述 据不完全统计&#xff0c;2024年3月&#xff0c;全球网络安全市场共发生投融资事件53起&#xff0c;其中国内4起&#xff0c;国外49起。 3月全球络安全产业投融资统计表&#xff08;数据来源&#xff1a;航行资本、36氪&#xff09; 整体而言&#xff0c;国内4起投融资事…

EasyExcel中对图片大小及位置进行调整(自定义拦截器)

如何对我们导出的图片设置大小和位置 首先我们先丢入一张图片,这里我就直接通过URL的形式进行编写 定义一个存储图片的类 import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter;import java.net.URL;Getter Setter EqualsAndHashCode public class…

AI写作软件哪个好?这4款好评如潮

在信息时代&#xff0c;AI技术的发展的日新月异&#xff0c;AI写作软件也因此诞生。特别是人们对于高效、便捷的写作工具需求日益增长&#xff0c;AI写作软件作为一种新兴的工具&#xff0c;在帮助人们提升写作效率、拓展创作思路方面发挥着越来越重要的作用。这些AI写作软件为…

C语言 函数——代码风格

目录 基本的代码规范 程序版式 对齐&#xff08;Alignment&#xff09;与缩进&#xff08;indent&#xff09; 变量的对齐规则 空行——分隔程序段落的作用 代码行内的空格——增强单行清晰度 代码行 长行拆分 标识符命名规则 标识符命名的共性规则 windows应用程序…

PostgreSQL入门到实战-第十八弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(二)官网地址PostgreSQL概述PostgreSQL中表别名命令理论PostgreSQL中表别名命令实战更新计划 PostgreSQL中表连接操作(二) 了解PostgreSQL表别名及其实际应用程序。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…

19c数据库/dev/shm/过小导致pga内存不够

pga_aggregate_limit已经设置了120G&#xff0c;alert还是报内存不够 查询select * from v$pgastat&#xff0c;发现MGA占了80G内存 查看/dev/shm: 发现设置了7G&#xff0c;操作系统是512G&#xff0c;正常情况下/dev/shm应该是操作系统的一半&#xff0c;修改为250G后数据库…

微信小程序 django+nodejs电影院票务售票选座系统324kd

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端&#xff1a;HTML5,CSS3 VUE 后端&#xff1a;java(springbootssm)/python(flaskdja…

vue3:菜单、标签页和面包屑联动效果

文章目录 1.整体思路2.实现过程 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; openAI 的 GPT 大模型的发展历程。 1.整体思路 在之前做的后台项目中&#xff0c;菜单、标签页和面包屑之间的联动&#xff0c;自己都是通过在路由前置守卫中&#xff0c;定义b…

微服务面试题二

1.什么是雪崩 微服务之间相互调用&#xff0c;因为调用链中的一个服务故障&#xff0c;引起整个链路都无法访问的情况。 如何解决雪崩&#xff1f; 超时处理&#xff1a;请求超时就返回错误信息&#xff0c;不会无休止等待仓壁模式&#xff1a;限定每个业务能使用的线程数&a…

WPS的JS宏如何批量实现文字的超链接

表格中需要对文字进行超链接&#xff0c;每个链接指引到不同的地址。例如&#xff1a; 实现如下表格中&#xff0c;文件名称超级链接到对应的文件路径上&#xff0c;点击对应的文件名称&#xff0c;即可打开对应的文件。 序号文件名称文件路径1变更申请与处理表.xls文档\系统…