前言

对于设计模式,相信很多开发者并不陌生,我在学习过程中希望把自己的一些总结和心得体会与你分享。
本专栏主要将重点放在设计模式在游戏中的应用,会结合大家熟悉的游戏场景和功能阐述设计模式在该处应用的好处。因为设计模式很多,而且许多其实在游戏中并不会有应用空间,所以部分设计模式并不会出现在本专栏中,如果是希望学习所有设计模式的同学可以去寻找其他更优质的文章。
这是我开的第几个坑了?咕咕咕 如今已经找到工作并且现在工作也已稳定,虽然加班很多,但是我还是希望把业余时间投入到文章创作之中,会努力把之前的坑给填上的。

1. 设计模式概述

1.1 设计模式的定义

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

1.2 设计模式七大原则(概述)

1.2.1 单一职责原则(Single Responsibility Principle, SRP)

一个类只负责一个功能领域中的相应职责

1.2.2 开闭原则(Open-Closed Principle, OCP)

软件实体应对扩展开放,而对修改关闭

1.2.3 里氏代换原则(Liskov Substitution Principle, LSP)

所有引用基类对象的地方能够透明地使用其子类的对象

1.2.4 依赖倒转原则(Dependence Inversion Principle, DIP)

抽象不应该依赖于细节,细节应该依赖于抽象

1.2.5 接口隔离原则(Interface Segregation Principle, ISP)

使用多个专门的接口,而不使用单一的总接口

1.2.6 合成复用原则(Composite Reuse Principle, CRP)

尽量使用对象组合,而不是继承来达到复用的目的

1.2.7 迪米特法则(Law of Demeter, LoD)

一个软件实体应当尽可能少地与其他实体发生相互作用

1.3 设计模式的内容

设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果。

1.3.1 模式名称(Pattern Name)

通过一两个词来描述模式的问题、解决方案和效果,以便更好地理解模式并方便开发人员之间的交流,绝大多数模式都是根据其功能或模式结构来命名的(GoF设计模式中没有一个模式用人名命名,);

1.3.2 问题(Problem)

描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因;

1.3.3 解决方案(Solution)

描述了一个设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式,通常解决方案通过UML类图和核心代码来进行描述;

1.3.4 效果(Consequences)

描述了模式的优缺点以及在使用模式时应权衡的问题。

1.4 设计模式的分类

1.4.1 创建型模式:

工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

1.4.2 结构型模式:

适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

1.4.3 行为型模式:

策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

3. 设计模式七大原则

3.1 单一职责原则(Single responsibility principle)

一个类应该只负责一项职责。

3.2 接口隔离原则(Interface Segregation Principle)

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。

3.3 依赖倒转原则(Dependence Inversion Principle)

依赖倒转(倒置)的中心思想是面向接口编程,所谓“倒转”是指抽象不应该依赖细节,而是细节应该依赖抽象。也就是高层模块不应该依赖低层模块,二者都应该依赖其抽象。因为相对于细节的多变性,抽象的东西要稳定的多。

3.4 里氏替换原则(Liskov Substitution Principle)

所有引用基类的地方必须能透明地使用其子类的对象。也就是在继承关系中,子类尽量不要重写父类的方法。继承实际上让两个类耦合性增强了,特别是运行多态比较频繁的时,整个继承体系的复用性会比较差。
比如一种极端情况:一个类继承了另一个类,但却重写了所有方法,那么继承的意义何在?说好的复用呢?
解决方法是把原来的父类和子类都继承一个更通俗的基类,在适当的情况下,可以通过聚合,组合,依赖等来代替。

3.5 开闭原则(Open Closed Principle)

一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。也就是当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。用抽象构建框架,用实现扩展细节。
开闭原则是编程中最基础、最重要的设计原则。编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

3.6 迪米特法则(最少知识原则)(Demeter Principle)

即一个类对自己依赖的类知道的越少越好,核心是降低类之间的耦合。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何信息。
避免与非直接朋友的耦合,只与直接的朋友通信,所谓的直接朋友是出现成员变量,方法参数,方法返回值中的类。而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

3.7 合成/聚合复用原则(Composite Reuse Principle)

尽量使用合成/聚合的方式,而不是使用继承。

告知

由于这篇文章成文较早,所以很多参考文献已不可考,再次道歉,如有相似之处,敬请谅解。

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

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

相关文章

SpringBoot + RustFS 实现文件切片极速上传技术

本文将手把手教你如何通过 SpringBoot 和 RustFS 构建高性能文件切片上传系统,解决大文件传输的痛点,实现秒传、断点续传和分片上传等高级功能。 目录 一、为什么选择 RustFS SpringBoot? 二、环境准备与部署 2.1 安装 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切换英文段落大小写

在Word和WPS文字中编辑英文段落时,有时候英文字母的大小写不规范,或者需要把某一段全部改为大写字母怎么办?使用ShiftF3组合键即可快速在三种模式中切换:全部大写、全部小写、首字母大写——其中首字母大写的Word是每一句话的第一…

成都金牛区哪里租好办公室?国际数字影像产业园享税收优惠

在成都金牛区租赁优质办公室,国际数字影像产业园凭借其享有的税收优惠政策,成为了许多企业的首选之地。税收优惠对于租赁办公室的企业来说,是一笔不小的成本节省。国际数字影像产业园针对入驻企业提供的税收优惠政策,能在企业运营…

CSS `:is()` `:where()` 实战指南:简化选择器,提升可维护性

🎯 CSS :is() & :where() 实战指南:简化选择器,提升可维护性你是否在项目中写过一大串重复的选择器?比如: h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }这样的代码既冗长又难维护。 现在 CSS 提供了 :is() 和…

Linux I/O 访问架构深入分析

Linux I/O 访问架构深入分析 目录 概述I/O 架构层次核心数据结构I/O 处理流程VFS 虚拟文件系统块设备I/O字符设备I/O内存映射I/O异步I/O机制I/O调度器调试工具与方法性能优化策略 概述 Linux I/O 系统是一个多层次、高度抽象的架构,旨在为应用程序提供统一的文件访问…

Linux:6_基础IO

基础IO 一.理解"文件" 文件分类 1.内存级(被打开)文件 2.磁盘级文件 1. 狭义理解 文件在磁盘里磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的磁盘是外设 (即是输出设备也是输入设备)磁盘上的文件本质是对文件的所有操作,都是对外…

Coze源码分析-资源库-删除插件-前端源码-核心逻辑

删除插件逻辑 1. 删除操作入口组件 删除插件操作主要通过 usePluginConfig hook 中的 renderActions 方法实现,该方法返回 TableAction 组件来处理表格行的操作。 文件位置:frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地状态(Flink 1.x)

最初的架构将状态以 JVM Heap 对象的形式存储在 TaskManager 的内存中。对于小规模数据集,这种方式效果良好,但随着状态大小的增长超出内存,将所有状态保存在内存中变得成本高昂且不稳定。 为了解决状态规模增长的问题,引入了一种…

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南 关键词:印度股票数据对接 NSE实时行情 BSE证券接口 金融API开发 Python请求示例一、印度股市数据源技术解析(核心价值) 印度两大交易所数据获取难点: 时区差异&a…

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(文末附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

🔔 AFSim2.9.0 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) AFSim介绍 AFSim(Advanced Framework for Simulation Integration & Modeling【高级仿真集成与…

ArcGIS学习-18 实战-降雨量空间分布插值分析

设置环境加载要素投影查看要素,发现均不是投影数据,但都是地理坐标都是WGS1984使用工具进行批量投影然后新建空地图,重新加载确认图层的投影与栅格数据一致插值样条法得到反距离权重法插值得到克里金法插值得到

HarmonyOS应用开发:深入理解声明式UI与弹窗交互的最佳实践

HarmonyOS应用开发:深入理解声明式UI与弹窗交互的最佳实践 引言 随着HarmonyOS 4.0的发布及后续版本的演进,华为的分布式操作系统已经进入了全新的发展阶段。基于API 12及以上的开发环境为开发者提供了更强大、更高效的开发工具和框架。在HarmonyOS应用…

探索Java并发编程--从基础到高级实践技巧

Thread(线程)线程 程序执行的最小单位(一个进程至少有一个线程)。线程内有自己的执行栈、程序计数器(PC),但与同进程内其他线程共享堆内存与进程资源 在java中,线程由java.lang.Thr…

Go语言实战案例-开发一个Markdown转HTML工具

这个小工具可以把 .md 文件转换为 .html 文件,非常适合写笔记、博客或者快速预览 Markdown 内容。📌 案例目标• 读取一个 Markdown 文件• 使用开源库将 Markdown 转换为 HTML• 将 HTML 输出到新文件中📦 所需库我们用 goldmark 这个 Markd…

基于51单片机的太阳能锂电池充电路灯

基于51单片机的太阳能锂电池充电路灯系统设计 1 系统功能介绍 本设计以 STC89C52单片机 为核心,构建了一个能够利用太阳能为锂电池充电并智能控制LED路灯的系统。系统结合了 光照检测电路、LED灯电路、按键检测电路、太阳能充电电路 等模块,实现了节能、…

PAT 1178 File Path

这一题的大意是给出了一个windows的文件夹目录,让我们按照所属的目录关系,来找相应的目录是否存在,如果存在,就输出找到该文件的路径,如果不存在输出error 我的思路是用合适的树形结构保存下来目录的所属关系&#xff…

云原生部署_k8s入门

K8S官网文档:https://kubernetes.io/zh/docs/home/Kubernetes是什么Kubernetes 是用于自动部署、扩缩和管理容器化应用程序的开源系统。 Kubernetes 源自 ,Google 15 年生产环境的运维经验同时凝聚了社区的最佳创意和实践。简称K8s.Kubernet…

实战项目-----Python+OpenCV 实现对视频的椒盐噪声注入与实时平滑还原”

实战项目实现以下功能:功能 1:为视频每一帧添加椒盐噪声作用:模拟真实环境中图像传输或采集时可能出现的噪声。实现方式:读取视频的每一帧。随机选择 10000 个像素点,将其设置为黑色(0)或白色&a…

Day42 PHP(mysql注入、跨库读取)

一、sql注入基本原理:没有对用户输入的数据进行限制,导致数据库语句可以做什么,用户就可以做什么。取决于不同数据库的不同查询语言,所以为什么有mysql注入/orcale注入等等。步骤:【access】表名(字典爆破来…

机器人控制器开发(部署——软件打包备份更新)

文章总览 为什么做备份更新 为机器人控制器设计一套打包备份更新机制,为控制器的批量生产和产品与项目落地做准备。 当某个模块出现bug需要升级时,用户可以快速获取正确的bak包并导入到控制器中重启生效。 如果没有做好软件的备份更新机制&#xff0c…