游戲中的設計模式——第一篇 設計模式簡介

前言

對于設計模式,相信很多開發者并不陌生,我在學習過程中希望把自己的一些總結和心得體會與你分享。
本專欄主要將重點放在設計模式在游戲中的應用,會結合大家熟悉的游戲場景和功能闡述設計模式在該處應用的好處。因為設計模式很多,而且許多其實在游戲中并不會有應用空間,所以部分設計模式并不會出現在本專欄中,如果是希望學習所有設計模式的同學可以去尋找其他更優質的文章。
這是我開的第幾個坑了?咕咕咕 如今已經找到工作并且現在工作也已穩定,雖然加班很多,但是我還是希望把業余時間投入到文章創作之中,會努力把之前的坑給填上的。

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…