常见的设计模式
设计模式是一套被反复使用的、代码设计经验的总结。它们被用来解决软件开发中的某些常见问题,提高代码的可维护性、可扩展性和重用性。设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。以下是一些常见的设计模式及其简要说明:
创建型模式
1. 单例模式(Singleton Pattern)
**目的**:确保一个类只有一个实例,并提供一个全局访问点。
**实现**:通过私有化构造函数和静态方法创建实例。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
2. 工厂方法模式(Factory Method Pattern)
**目的**:定义一个用于创建对象的接口,让子类决定实例化哪个类。
**实现**:通过在子类中重写工厂方法来创建具体对象。
```java
abstract class Creator {
public abstract Product factoryMethod();
}
class ConcreteCreator extends Creator {
public Product factoryMethod() {
return new ConcreteProduct();
}
}
```
3. 抽象工厂模式(Abstract Factory Pattern)
**目的**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
**实现**:通过抽象工厂定义一组创建方法,由具体工厂类实现这些方法。
```java
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
class WinFactory implements GUIFactory {
public Button createButton() {
return new WinButton();
}
public Checkbox createCheckbox() {
return new WinCheckbox();
}
}
```
结构型模式
4. 适配器模式(Adapter Pattern)
**目的**:将一个类的接口转换为客户希望的另一个接口,使得原本不兼容的类可以一起工作。
**实现**:通过适配器类实现目标接口,并在内部调用实际接口的方法。
```java
interface Target {
void request();
}
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
```
5. 装饰器模式(Decorator Pattern)
**目的**:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
**实现**:通过创建一个装饰类包装原始类,并在装饰类中调用原始类的方法。
```java
interface Component {
void operation();
}
class ConcreteComponent implements Component {
public void operation() {
System.out.println("ConcreteComponent operation");
}
}
class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation() {
component.operation();
}
}
```
行为型模式
6. 策略模式(Strategy Pattern)
**目的**:定义一系列算法,将每一个算法封装起来,并让它们可以互换。
**实现**:通过定义一个策略接口,并由具体策略类实现该接口。
```java
interface Strategy {
void execute();
}
class ConcreteStrategyA implements Strategy {
public void execute() {
System.out.println("Strategy A executed");
}
}
class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
```
7. 观察者模式(Observer Pattern)
**目的**:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖的对象都会得到通知并被自动更新。
**实现**:通过在目标对象中维护观察者列表,并在状态变化时通知所有观察者。
```java
interface Observer {
void update();
}
class ConcreteObserver implements Observer {
public void update() {
System.out.println("Observer updated");
}
}
class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
```
参考资源
- **《设计模式:可复用面向对象软件的基础》** by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
- **Refactoring Guru**:[Design Patterns](https://refactoring.guru/design-patterns)
- **Head First Design Patterns** by Eric Freeman, Elisabeth Robson
通过这些设计模式,可以提高代码的结构性和可维护性,使软件开发更加高效和灵活。每种模式都有其适用场景,理解并正确应用这些模式是提升编程能力的重要途径。
相关文章:
常见的设计模式
设计模式是一套被反复使用的、代码设计经验的总结。它们被用来解决软件开发中的某些常见问题,提高代码的可维护性、可扩展性和重用性。设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。以下是一些常见的设计模式及其简要说明: …...

Camtasia2024中文版最新电脑录屏剪辑神器!
大家好,今天我要安利一个我最近超级喜欢的工具——Camtasia2024中文版!这款软件真的太棒了,它让我的视频编辑工作变得更加轻松和高效。如果你也对视频制作感兴趣,那么一定要尝试一下这款神器哦! Camtasia2024win-正式…...

【性能优化】表分区实践最佳案例
背景 随着数字化建设的持续深入,企业的业务规模迎来了高速发展,其数据规模也呈现爆炸式增长,如果继续使用传统解决方案,将所有数据存储在一个表中,对数据的查询和维护效率将是一个巨大的挑战,在这个背景下…...

力扣SQL50 项目员工 I ROUND AVG
Problem: 1075. 项目员工 I 👨🏫 参考题解 Code select project_id,ROUND(AVG(e.experience_years),2) as average_years FROMproject as p LEFT JOINemployee as e ONp.employee_id e.employee_id GROUP BYp.project_id;...
nuscenes 数据集学习笔记
目录 数据信息类型: 数据信息类型: Map & Camera(png), Lidar(激光雷达) & Radar(雷达)(pcd), Json 文件结构(以v1.0-mini为例): maps: 存放Map的png文件samples: 存放Camera, Lidar, Radar关键非结构化数据信息, 带标注sweeps: 存放Camera, Lidar, Radar 次要非结构…...

在Windows上用MinGW编译OpenCV项目运行全流程
一、准备软件 OpenCV源码CMake工具MinGW工具链(需要选用 posix 线程版本:原因见此) 二、操作步骤 官网提供了VC16构建版本的二进制包,但是没有给出GCC编译的版本。所以如果使用MinGW进行构建,那就只能从源码开始构建…...

用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配
数据可视化大屏 基于 Vue3、Typescript、DataV、ECharts5 框架的大数据可视化(大屏展示)开发。此项目vue3实现界面,采用新版动态屏幕适配方案,全局渲染组件封装,支持数据动态刷新渲染、内部DataV、ECharts图表都支持自…...
大二学生眼中的Netty?基于Netty实现内网穿透!
爷的开场白 掘金的朋友们大家好!我是新来的Java练习生 CodeCodeBond! 这段时间呢,博主在学习Netty,想做一个自己感兴趣好玩的东西,那就是内网穿透!!(已经实现主要代理功能但有待优化…...
JavaStringBuffer与StringBuilder
StringBuffer、StringBuilder 文章目录 StringBuffer、StringBuilderStringBuffer和StringBuilder的理解可变性分析对于String对于StringBuilder 常用方法执行效率对比 StringBuffer和StringBuilder的理解 String 不可变的字符序列 StringBuffer 可变的字符序列 JDK1.0声明&…...

云徙科技助力竹叶青实现用户精细化运营,拉动全渠道销售额增长
竹叶青茶以其别具一格的风味与深厚的历史底蕴,一直被誉为茶中瑰宝。历经千年的传承与创新,竹叶青不仅坚守着茶叶品质的极致追求,更在数字化的浪潮中,率先打破传统,以科技力量赋能品牌,成为茶行业的领军者。…...

深度揭秘:深度学习框架下的神经网络架构进化
深度学习框架下的神经网络架构经历了从基础到复杂的显著进化,这一进程不仅推动了人工智能领域的突破性进展,还极大地影响了诸多行业应用。本文旨在深入浅出地揭示这一进化历程,探讨关键架构的创新点及其对现实世界的影响。 引言:…...

MySQL的DML语句
文章目录 ☃️概述☃️DML☃️添加数据☃️更新和删除数据☃️DML的重要性 ☃️概述 MySQL 通用语法分类 ● DDL: 数据定义语言,用来 定义数据库对象(数据库、表、字段) ● DML: 数据操作语言,用来对数据库表中的数据进行增删改 …...
Wireshark的基本用法以及注意事项
Wireshark 是一个流行的网络协议分析工具,可以捕获和分析网络数据包。以下是一些常见的 Wireshark 的用法: 安装和启动:首先需要下载和安装 Wireshark。安装完成后,可以通过启动 Wireshark 应用程序来打开它。 选择网络接口&…...

集团门户网站的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,论坛管理,集团文化管理,基础数据管理,公告通知管理 前台账户功能包括:系统首页,个人中心,论坛࿰…...

Tomcat基础详解
第一篇:Tomcat基础篇 lecture:邓澎波 一、构建Tomcat源码环境 工欲善其事必先利其器,为了学好Tomcat源码,我们需要先在本地构建一个Tomcat的运行环境。 1.源码环境下载 源码有两种下载方式: 1.1 官网下载 https://…...
【Python爬虫】爬取名人名言页面并进行简单的数据清洗(入门级)
目录 资源链接 一、网站选择 二、数据爬取要求 三、数据清洗要求 四、实现代码 1.数据采集 2.数据清洗 资源链接 下面有笔者所放的源码下载链接,读者可自行下载: 链接:https://pan.baidu.com/s/1YmTdlnbSJLvLrrx92zz6Qg 提取码&…...

Microsoft Visual C++ Redistributable 【安装包】【高速下载】
方法1、可以从官方下载,如下图 Visual C Redistributable for Visual Studio 2015 但是此链接只有一个版本 方法2 已经下载好并且已经整理好了2008--2022的所有版本点击下方链接即可高速下载 如果是win7-win8-win10-win11直接可以下载2015--2022版本,…...

MFC绘制哆啦A梦
文章目录 OnPaint绘制代码完整Visual Studio工程下载其他卡通人物绘制 OnPaint绘制代码 CPaintDC dc(this); // 用于绘画的设备上下文CRect rc;GetWindowRect(rc);int cxClient rc.Width();int cyClient rc.Height();// 辅助线HPEN hPen CreatePen(PS_DOT, 1, RGB(192, 192,…...

网络编程(TCP协议,UDP协议)
目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据,并打印 2、客户端…...
读取Jar包下文件资源的问题及解决方案
问题 项目A代码调用到Resouces下的文件a.sh,打包成Jar包后,项目B调用对应方法时,出现报错,找不到a.sh文件路径,原来的代码可能是: URL resource getClass().getClassLoader().getResource("a.sh&qu…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...