当前位置: 首页 > news >正文

【HeadFirst系列之HeadFirst设计模式】第14天之与设计模式相处:真实世界中的设计模式

与设计模式相处:真实世界中的设计模式

设计模式是软件开发中的经典解决方案,它们帮助我们解决常见的设计问题,并提高代码的可维护性和可扩展性。在《Head First设计模式》一书中,作者通过生动的案例和通俗的语言,深入浅出地介绍了各种设计模式的核心思想和使用场景。本文将基于书中的“与设计模式相处-真实世界中的模式”章节,提炼总结设计模式的核心内容,并结合实际应用场景和代码示例,帮助大家更好地理解和应用设计模式。

在这里插入图片描述

1. 设计模式的核心思想

1.1 遇到什么问题?

在软件开发过程中,我们经常会遇到一些重复出现的问题,例如:

  • 代码重复:相似的代码在不同的地方重复出现,导致维护困难。
  • 紧耦合:模块之间的依赖关系过于紧密,修改一个模块可能会影响其他模块。
  • 扩展性差:系统难以扩展,新增功能时需要修改大量现有代码。

1.2 怎么解决的?

设计模式提供了一套经过验证的解决方案,帮助我们解决上述问题。它们通过封装变化、解耦依赖、提高复用性等方式,使代码更加灵活和可维护。

1.3 引入设计模式

设计模式并不是银弹,它们并不是用来解决所有问题的。相反,设计模式是用来解决特定场景下的特定问题的。在使用设计模式时,我们需要根据具体的问题场景选择合适的模式。

1.4 使用场景

设计模式的使用场景非常广泛,几乎涵盖了软件开发的各个方面。例如:

  • 创建型模式:用于对象的创建,如工厂模式、单例模式等。
  • 结构型模式:用于类和对象的组合,如适配器模式、装饰器模式等。
  • 行为型模式:用于对象之间的交互,如观察者模式、策略模式等。

1.5 优缺点

设计模式的优点在于它们提供了一套经过验证的解决方案,可以帮助我们快速解决常见的设计问题。然而,设计模式也有其缺点,例如:

  • 过度设计:在不必要的情况下使用设计模式,可能会导致代码复杂化。
  • 学习曲线:设计模式需要一定的学习成本,初学者可能需要花费一些时间来理解和掌握。

2. 设计模式在JDK和Spring框架中的应用

2.1 JDK中的设计模式

JDK中广泛使用了各种设计模式,以下是一些常见的例子:

2.1.1 工厂模式

java.util.Calendar 类中的 getInstance() 方法就是一个典型的工厂方法模式的应用。它根据不同的时区和地区返回不同的 Calendar 实例。

Calendar calendar = Calendar.getInstance();
2.1.2 单例模式

java.lang.Runtime 类是一个典型的单例模式的应用。Runtime 类提供了访问运行时环境的方法,并且在整个应用程序中只有一个实例。

Runtime runtime = Runtime.getRuntime();
2.1.3 观察者模式

java.util.Observablejava.util.Observer 是观察者模式的实现。Observable 类代表被观察的对象,Observer 接口代表观察者。

class ConcreteObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("Received update: " + arg);}
}Observable observable = new Observable();
observable.addObserver(new ConcreteObserver());
observable.notifyObservers("Hello, Observer!");

2.2 Spring框架中的设计模式

Spring框架中也大量使用了设计模式,以下是一些常见的例子:

2.2.1 依赖注入(DI)模式

Spring框架的核心就是依赖注入模式。通过依赖注入,Spring可以将对象的依赖关系从代码中解耦出来,使得代码更加灵活和可测试。

@Service
public class MyService {private final MyRepository repository;@Autowiredpublic MyService(MyRepository repository) {this.repository = repository;}
}
2.2.2 代理模式

Spring AOP(面向切面编程)使用了代理模式来实现横切关注点的分离。Spring通过动态代理为目标对象创建代理对象,从而在不修改原始代码的情况下增强其功能。

@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}
}
2.2.3 模板方法模式

Spring的 JdbcTemplate 类是一个典型的模板方法模式的应用。JdbcTemplate 封装了JDBC操作的通用流程,用户只需要关注具体的SQL语句和结果处理。

@Autowired
private JdbcTemplate jdbcTemplate;public List<User> getAllUsers() {return jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper<>(User.class));
}

3. 代码示例

3.1 策略模式

策略模式允许我们定义一系列算法,并将它们封装在独立的类中,使得它们可以互换使用。以下是一个简单的策略模式示例:

interface Strategy {int execute(int a, int b);
}class AddStrategy implements Strategy {@Overridepublic int execute(int a, int b) {return a + b;}
}class SubtractStrategy implements Strategy {@Overridepublic int execute(int a, int b) {return a - b;}
}class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int a, int b) {return strategy.execute(a, b);}
}public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new AddStrategy());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new SubtractStrategy());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));}
}

3.2 装饰器模式

装饰器模式允许我们动态地为对象添加新的行为,而不会影响其他对象。以下是一个简单的装饰器模式示例:

interface Coffee {String getDescription();double getCost();
}class SimpleCoffee implements Coffee {@Overridepublic String getDescription() {return "Simple Coffee";}@Overridepublic double getCost() {return 5.0;}
}class MilkDecorator implements Coffee {private Coffee coffee;public MilkDecorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic String getDescription() {return coffee.getDescription() + ", Milk";}@Overridepublic double getCost() {return coffee.getCost() + 1.5;}
}public class DecoratorPatternDemo {public static void main(String[] args) {Coffee coffee = new SimpleCoffee();System.out.println(coffee.getDescription() + " $" + coffee.getCost());coffee = new MilkDecorator(coffee);System.out.println(coffee.getDescription() + " $" + coffee.getCost());}
}

4. 总结

设计模式是软件开发中的宝贵财富,它们帮助我们解决常见的设计问题,并提高代码的可维护性和可扩展性。通过理解设计模式的核心思想和使用场景,我们可以更好地应用它们来解决实际问题。同时,JDK和Spring框架中的设计模式应用也为我们提供了丰富的参考案例。希望本文能够帮助大家更好地理解和应用设计模式,写出更加优雅和高效的代码。


参考文献

  • 《Head First设计模式》 by Eric Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra

相关文章:

【HeadFirst系列之HeadFirst设计模式】第14天之与设计模式相处:真实世界中的设计模式

与设计模式相处&#xff1a;真实世界中的设计模式 设计模式是软件开发中的经典解决方案&#xff0c;它们帮助我们解决常见的设计问题&#xff0c;并提高代码的可维护性和可扩展性。在《Head First设计模式》一书中&#xff0c;作者通过生动的案例和通俗的语言&#xff0c;深入…...

JDBC 完全指南:掌握 Java 数据库交互的核心技术

JDBC 完全指南&#xff1a;掌握 Java 数据库交互的核心技术 一、JDBC 是什么&#xff1f;为什么它如此重要&#xff1f; JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数…...

Vue父子组件传递笔记

Vue父子组件传递笔记 props 父组件向子组件进行传值 &#xff08;1&#xff09;在父组件APP.vue <template><div> <!-- 给子组件Child.vue传递以msg的信号&#xff0c;传递的信息内容为messages --><Child :msg"messages"></Child>…...

文件上传漏洞与phpcms漏洞安全分析

目录 1. 文件上传漏洞简介 2. 文件上传漏洞的危害 3. 文件上传漏洞的触发条件 1. 文件必须能被服务器解析执行 2. 上传目录必须支持代码执行 3. 需要能访问上传的文件 4. 例外情况&#xff1a;非脚本文件也可能被执行 4. 常见的攻击手法 4.1 直接上传恶意文件 4.2 文件…...

【deepseek】辅助思考生物学问题:ICImapping构建遗传图谱gap较大

基于ICImapping构建遗传图谱的常见问题与解答 问题一&#xff1a;染色体两端标记间遗传距离gap较大 答疑一 标记密度不足&#xff08;如芯片设计时分布不均&#xff09;重组概率低基因组结构变异软件算法限制 Deepseek的解释 #### 1. **染色体末端的重组率较低** - **现象*…...

linux磁盘非lvm分区

linux磁盘非lvm分区 类似于windows划分C盘、D盘&#xff0c;并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区&#xff0c;类似windows的磁盘管理工具 下载方式&#xff1a; 乌班图/debian系列&#xff1a; sudo apt install gparted红帽…...

Windows下sql server2012安装流程

准备工作 确认系统要求&#xff1a;确保 Windows 系统为 Windows 7 或更高版本&#xff0c;且为 64 位操作系统&#xff0c;CPU 在 2GHz 以上&#xff0c;内存 4GB 或更高。 下载安装包&#xff1a;从微软官方网站或其他可靠渠道下载 SQL Server 2012 安装包。 关闭相关软件&am…...

css之英文换行样式

在 CSS 中&#xff0c;要实现英文文本自动换行但不从单词中间断开的效果&#xff0c;可以使用 word-wrap 或 overflow-wrap 属性。以下是相关的 CSS 属性和它们的配置&#xff1a; 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…...

绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 通过 Lr 软件丰富的工具和功能&#xff0c;对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项&#xff0c;精准控制照片亮度、对比度、色温、色调等基础要素&#xff1b;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节&#xff1b;利…...

文件解析:doc、docx、pdf

1.doc解析 ubuntu/debian系统应先安装工具 apt-get install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr \ flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig pip install textract解析&#xff1a; import te…...

计算机网络基础:VLAN(虚拟局域网)

1. VLAN 虚拟局域网&#xff1a;可以用来隔离广播 广播和广播域&#xff1a; arp 出不了路由器&#xff0c;只能攻击内网 路由器可以隔离广播&#xff08;物理隔离&#xff09;缺点是成本高、不灵活 2. VLAN 隔离广播 静态VLAN&#xff1a;基于交换机端口号划分 动态VLAN&am…...

C++学习笔记(十一)——循环结构

循环结构的作用 循环结构用于重复执行某一代码块&#xff0c;直到满足特定条件后退出循环。 C 提供了以下三种循环结构&#xff1a; for 循环&#xff08;确定次数的循环&#xff09;while 循环&#xff08;条件控制的循环&#xff09;do-while 循环&#xff08;至少执行一次的…...

【C++】二叉树相关算法题

一、根据二叉树创建字符串 题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&#xff0c;转化后需要省略所有…...

物联网IoT系列之MQTT协议基础知识

文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么&#xff1f;什么是MQTT&#xff1f;为什么说MQTT是适用于物联网的协议&#xff1f;MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程

智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台&#xff08;Intelligent AI Travel Recommendation Platform&#xff09;是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...

【Node.js入门笔记1---初始Node.js)】

Node.js入门笔记1 初始Node.js1.Node.js简介2.Node.js中js的运行环境3.Node.js 可以做什么4.Node.js 怎么学 初始Node.js 1.Node.js简介 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境&#xff0c;用于在服务器端运行 JavaScript 代码。它让开发者可以用 Java…...

自学Java-JavaSE基础加强(多线程)

自学Java-JavaSE基础加强&#xff08;多线程&#xff09; 一、创建线程1、方式一&#xff1a;继承Thread类小结 2、方式二&#xff1a;实现Runnable接口小结 3、方式三&#xff1a;实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…...

数字后端培训实战项目六大典型后端实现案例

Q1:请教一个问题&#xff0c;cts.sdc和func.sdc在innovus用如何切换&#xff1f;在flow哪一步切换输入cts.sdc&#xff1f;哪一步切换到func.sdc&#xff0c;具体如何操作&#xff1f; 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的&#xff1f;针对时…...

安卓免费多功能工具:一站式解决 PDF 阅读、编辑、转换等需求

软件介绍 今天要给大家介绍一款功能强大的PDF处理软件——PDFgear Android版。它是专为安卓设备打造的&#xff0c;完全免费&#xff0c;无需破解和激活就能使用。 此前&#xff0c;我们分享过它的桌面端&#xff0c;收获了大家的一致好评。今天要着重介绍的手机APP版本&…...

diffuser库使用本地模型生成图像

实验目的 使用diffuser库生成图像的文章是很多的&#xff0c;使用方法也并不复杂&#xff0c;安装库后调用现成的模型和接口即可&#xff0c;但是因为网络原因&#xff0c;模型下载总会遇到问题&#xff0c;对于使用服务器的研究者来说&#xff0c;挂梯子并不可行&#xff0c;…...

递归—基础算法

#基线条件和递归条件 #每个递归函数都有两部分&#xff1a;基线条件和递归条件。递归条件指的是函数调用自己&#xff0c;而基线条件则指的是函数不再调用自己&#xff0c;从而避免形成无限循环。 #栈&#xff1a;栈是一种数据结构&#xff0c;它是一种线性数据结构&#xff0c…...

全面复习回顾——C++语法篇2

23、字符串相加 string s3;s3s1s2;cout<<s3; 24、结构体基本操作 struct student {// write your code here......string name;int age;double height0.0; };int main() {// write your code here......student s;cin>>s.name;cin>>s.age;cin>>s.hei…...

探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比

文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析&#xff1a;5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析&#xff1a;卫星通信系统实例…...

Linux | Vim 鼠标不能右键粘贴、跨系统复制粘贴

注&#xff1a;本文为 “ Vim 中鼠标右键粘贴、跨系统复制粘贴问题解决方案” 相关文章合辑。 未整理去重。 Linux 入门&#xff1a;vim 鼠标不能右键粘贴、跨系统复制粘贴 foryouslgme 发布时间 2016 - 09 - 28 10:24:16 Vim 基础 命令模式&#xff08;command - mode&…...

无人机遥控器扩频技术解析!

一、扩频技术基本原理 扩频技术&#xff08;Spread Spectrum, SS&#xff09;通过将信号的频谱扩展至远大于原始带宽进行传输&#xff0c;提升抗干扰性、隐蔽性和多用户能力。其核心原理包括&#xff1a; 直接序列扩频&#xff08;DSSS&#xff09; 利用高速伪随机码&#x…...

Spring Boot API 项目中 HAProxy 与 Nginx 的选择与实践

在开发 Spring Boot 构建的 RESTful API 项目时&#xff0c;负载均衡和反向代理是提升性能与可用性的关键环节。HAProxy 和 Nginx 作为两种流行的工具&#xff0c;经常被用于流量分发&#xff0c;但它们各有侧重。究竟哪一个更适合你的 Spring Boot API 项目&#xff1f;本文将…...

OpenBMC:BmcWeb构造connect对象

OpenBMC:BmcWeb server.run-CSDN博客 server在接收了tcp连接请求后,会构造一个ConnectionType对象,然后通过post调度,运行该对象的start函数 1.ConnectionType类型 其实也就是using ConnectionType = Connection<Adaptor, Handler>;类型 由于ConnectionType实例化于…...

ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)

目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点&#xff08;来自局部关键帧&#xff09;UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…...

WordPress使用(3)

前面文章讲述了如何利用docker进行wordpress系统的安装及相关设置&#xff0c;本文将介绍如何进行站点数据和数据库数据的备份。 1. 备份数据库 # 进入mysql容器内部 docker exec -it mysqlwp bash# 使用mysqldump 命令导出数据库 mysqldump -u root -p wordpress > wordp…...

Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起了解下什么是Docker与与Docker的仓库、镜像、容器三大概念。 …...