設計模式7大原則與UML類圖詳解

設計模式7大原則與UML類圖詳解

引言 🌟

在這里插入圖片描述

在軟件工程領域,設計模式和UML(統一建模語言)是提高代碼質量、增強系統可維護性的重要工具。設計模式提供了解決軟件設計中常見問題的通用方案,而UML則為我們提供了一種可視化的建模語言,幫助我們清晰地表達系統結構和行為。本文將深入探討設計模式的七大原則,并結合UML類圖進行詳細解析。

一、設計模式七大原則 💡

設計模式的七大原則是軟件設計的基礎準則,遵循這些原則可以使我們的代碼更加靈活、可維護和可擴展。下面我們將逐一介紹這七大原則,并通過實例和類圖進行說明。

1. 單一職責原則(Single Responsibility Principle) 🎯

定義:一個類應該只有一個引起它變化的原因。

解釋:如果一個類承擔了過多的職責,那么在一個職責發生變化時,可能會影響其他職責的實現,導致代碼難以維護和擴展。遵循單一職責原則,可以使類更加專注,降低耦合度。

示例:假設我們有一個Book類,它既負責管理書籍的信息,又負責打印書籍的信息。

違反單一職責原則的類圖

@startuml
class Book {- title: String- author: String+ setTitle(title: String): void+ setAuthor(author: String): void+ printBook(): void
}
@enduml

在這里插入圖片描述

重構后遵循單一職責原則的類圖

@startuml
class Book {- title: String- author: String+ setTitle(title: String): void+ setAuthor(author: String): void
}class BookPrinter {+ printBook(book: Book): void
}
@enduml

在這里插入圖片描述

在這個重構中,我們將打印功能從Book類中分離出來,創建了一個新的BookPrinter類,專門負責打印書籍的信息。

2. 開放封閉原則(Open/Closed Principle) 🚪

定義:軟件實體(類、模塊、函數等)應該對擴展開放,對修改關閉。

解釋:當我們需要為系統添加新的功能時,應該通過擴展已有模塊來實現,而不是修改已有模塊。這樣可以避免對現有代碼的修改,減少引入新錯誤的風險。

示例:假設我們有一個圖表繪制系統,最初只支持繪制圓形。

違反開放封閉原則的類圖

@startuml
class Shape {+ draw(): void
}class Circle {+ draw(): void
}
@enduml

在這里插入圖片描述

每次添加新形狀時,都需要修改Shape類或Circle類,這違反了開閉原則。

遵循開放封閉原則的類圖

@startuml
interface Shape {+ draw(): void
}class Circle implements Shape {+ draw(): void
}class Square implements Shape {+ draw(): void
}
@enduml

在這里插入圖片描述

通過定義一個Shape接口,我們可以輕松地添加新的形狀類,而無需修改現有代碼。

3. 里氏替換原則(Liskov Substitution Principle) 🔄

定義:所有引用基類的地方必須能透明地使用其子類的對象。

解釋:子類應該能夠替換父類并且不會影響程序的正確性。這意味著子類在繼承父類時,不應修改父類的行為。

示例:假設我們有一個Rectangle類,然后創建了一個Square類繼承自Rectangle

違反里氏替換原則的類圖

@startuml
class Rectangle {- width: int- height: int+ setWidth(width: int): void+ setHeight(height: int): void+ area(): int
}class Square extends Rectangle {+ setWidth(width: int): void {super.setWidth(width)super.setHeight(width)}+ setHeight(height: int): void {super.setWidth(height)super.setHeight(height)}
}
@enduml

在這個例子中,Square類重寫了setWidthsetHeight方法,導致無法正確計算面積,破壞了繼承關系。

遵循里氏替換原則的類圖

@startuml
interface Shape {+ area(): int
}class Rectangle implements Shape {- width: int- height: int+ setWidth(width: int): void+ setHeight(height: int): void+ area(): int
}class Square implements Shape {- side: int+ setSide(side: int): void+ area(): int
}
@enduml

RectangleSquare都作為Shape的實現類,各自實現自己的行為,避免了繼承帶來的問題。

4. 接口隔離原則(Interface Segregation Principle) 🔍

定義:客戶端不應該依賴它不需要的接口。

解釋:一個類對另一個類的依賴應該建立在最小的接口上。避免創建過大的接口,導致客戶端依賴于它們不需要的部分。

示例:假設我們有一個Animal接口,包含了飛行和游泳的方法。

違反接口隔離原則的類圖

@startuml
interface Animal {+ fly(): void+ swim(): void
}class Bird implements Animal {+ fly(): void+ swim(): void { throw UnsupportedOperationException() }
}class Fish implements Animal {+ fly(): void { throw UnsupportedOperationException() }+ swim(): void
}
@enduml

在這里插入圖片描述

BirdFish都實現了flyswim方法,但實際上Fish不需要飛行功能,Bird不需要游泳功能。

遵循接口隔離原則的類圖

@startuml
interface Flyable {+ fly(): void
}interface Swimmable {+ swim(): void
}class Bird implements Flyable {+ fly(): void
}class Fish implements Swimmable {+ swim(): void
}
@enduml

在這里插入圖片描述

通過將接口拆分為FlyableSwimmable,讓不同的類只實現它們需要的接口。

5. 依賴倒置原則(Dependency Inversion Principle) ????

定義:高層模塊不應該依賴低層模塊,二者都應該依賴其抽象。

解釋:抽象不應該依賴于細節,細節應該依賴于抽象。這樣可以降低模塊之間的耦合度,提高系統的靈活性。

示例:假設我們有一個OrderService類,它直接依賴于Database類。

違反依賴倒置原則的類圖

@startuml
class OrderService {- database: Database+ saveOrder(order: Order): void {database.save(order)}
}class Database {+ save(order: Order): void
}
@enduml

在這里插入圖片描述
1)

OrderService直接依賴于Database,如果需要更換數據庫,可能需要修改OrderService的代碼。

遵循依賴倒置原則的類圖

@startuml
interface DataStorage {+ save(order: Order): void
}class OrderService {- storage: DataStorage+ saveOrder(order: Order): void {storage.save(order)}
}class Database implements DataStorage {+ save(order: Order): void
}class CloudStorage implements DataStorage {+ save(order: Order): void
}
@enduml

在這里插入圖片描述

通過引入DataStorage接口,OrderService依賴于抽象,而不是具體實現。

6. 迪米特法則(Law of Demeter) 👥

定義:一個對象應該對其他對象有最少的了解。

解釋:一個類應該只與它的直接朋友通信,而不應該與陌生人通信。這有助于降低系統的耦合度。

示例:假設我們有一個University類,它直接調用了Department類的getProfessors方法,而Department類又調用了Professor類的getName方法。

違反迪米特法則的類圖

@startuml
class University {- departments: List<Department>+ getProfessorNames(): List<String> {for (department in departments) {for (professor in department.getProfessors()) {print(professor.getName())}}}
}class Department {- professors: List<Professor>+ getProfessors(): List<Professor> {return professors}
}class Professor {- name: String+ getName(): String {return name}
}
@enduml

University類直接依賴于DepartmentProfessor類的內部實現。

遵循迪米特法則的類圖

@startuml
class University {- departments: List<Department>+ getProfessorNames(): List<String> {for (department in departments) {for (name in department.getProfessorNames()) {print(name)}}}
}class Department {- professors: List<Professor>+ getProfessorNames(): List<String> {return [professor.getName() for professor in professors]}
}class Professor {- name: String+ getName(): String {return name}
}
@enduml

University類只與Department類交互,Department類負責內部細節,降低了耦合度。

7. 組合/聚合復用原則(Composition/Aggregation Reuse Principle) 🧩

定義:盡量使用組合/聚合關系,而不是繼承關系來復用代碼。

解釋:組合/聚合關系比繼承關系更加靈活,可以減少類之間的強耦合,提高系統的可維護性。

示例:假設我們有一個Engine類和一個Car類。

違反組合/聚合復用原則的類圖

@startuml
class Engine {+ start(): void
}class Car extends Engine {+ drive(): void
}
@enduml

在這里插入圖片描述

Car繼承了Engine,如果Engine類發生變化,Car類也會受到影響。

遵循組合/聚合復用原則的類圖

@startuml
class Engine {+ start(): void
}class Car {- engine: Engine+ drive(): void {engine.start()}
}
@enduml

在這里插入圖片描述

Car類通過組合Engine類來實現功能,這樣Car類與Engine類之間的耦合度更低,更容易擴展和維護。

二、UML類圖詳解 📊

UML(Unified Modeling Language)是一種用于軟件系統可視化建模的標準語言。UML類圖是UML中最常用的圖之一,用于描述系統中的類及其之間的關系。接下來,我們將結合設計模式的七大原則,進一步了解UML類圖的構成和用途。

1. UML類圖的基本構成

類(Class)
UML中的類表示系統中的一個對象類型。一個類通常由三部分組成:

  • 類名(Class Name):位于類的頂部,用于標識類的名稱。
  • 類的屬性(Attributes):位于類的中間部分,用于描述類的特性或數據成員。格式為可見性 名稱: 類型 [多重性],其中可見性包括+(公有)、-(私有)和#(保護)。
  • 類的方法(Methods):位于類的底部,用于描述類的行為或操作。格式為可見性 名稱(參數列表): 返回類型 [多重性]

示例類圖

@startuml
class Book {- title: String- author: String+ setTitle(title: String): void+ getTitle(): String+ setAuthor(author: String): void+ getAuthor(): String
}
@enduml

在這里插入圖片描述

2. 類之間的關系

UML類圖中的關系主要包括以下幾種:

  • 繼承(Inheritance/Generalization):表示子類繼承父類的屬性和方法。用帶空心三角箭頭的實線表示,箭頭指向父類。

    @startuml
    class Animal
    class Bird
    Bird --|> Animal
    @enduml
    

    在這里插入圖片描述

  • 實現(Implementation/Realization):表示類實現接口中的方法。用帶空心三角箭頭的虛線表示,箭頭指向接口。

    @startuml
    interface Flyable
    class Bird
    Bird ..|> Flyable
    @enduml
    

    在這里插入圖片描述

  • 關聯(Association):表示類之間的一種長期關系。用實線表示,可以帶箭頭表示方向。關聯可以是單向或雙向的。

    @startuml
    class Student
    class Course
    Student "1" -- "many" Course : registers
    @enduml
    

在這里插入圖片描述

  • 聚合(Aggregation):表示整體與部分的關系,其中部分可以獨立于整體存在。用帶空心菱形箭頭的實線表示,菱形指向整體。

    @startuml
    class Car
    class Engine
    Car o-- Engine : has
    @enduml
    

    在這里插入圖片描述

  • 組合(Composition):表示整體與部分的關系,其中部分不能獨立于整體存在。用帶實心菱形箭頭的實線表示,菱形指向整體。

    @startuml
    class House
    class Room
    House *-- Room : contains
    @enduml
    

    在這里插入圖片描述

  • 依賴(Dependency):表示一個類的變化可能會影響另一個類。用帶虛線的箭頭表示,箭頭指向被依賴的類。

    @startuml
    class Order
    class Database
    Order ..> Database : uses
    @enduml
    

    在這里插入圖片描述

3. 類圖的繪制工具

目前,有許多工具可以幫助我們繪制UML類圖,以下是一些常用的工具:

  • PlantUML:一種開源的、基于文本的UML繪圖工具,支持多種格式輸出。
  • StarUML:一款功能強大、界面友好的UML建模工具,支持多種UML圖。
  • Visual Paradigm:一款綜合性的建模工具,涵蓋從需求分析到部署的各個環節。
  • Lucidchart:在線UML繪圖工具,支持協作和多種格式導出。

在本博客中,我們將使用PlantUML進行類圖的繪制和展示。

4. 類圖在軟件設計中的應用

UML類圖在軟件設計中有以下幾個主要應用:

  • 系統分析:在設計初期,通過類圖描述系統的基本結構和類之間的關系,有助于明確系統的架構。
  • 代碼生成:一些工具可以根據類圖自動生成相應的代碼框架,提高開發效率。
  • 文檔生成:類圖作為系統設計的可視化文檔,便于團隊成員之間的溝通和理解。
  • 系統維護:通過查看類圖,可以快速理解系統的結構和類之間的關系,便于后期的維護和擴展。

三、設計模式與UML類圖結合實例 🛠?

為了更深入地理解設計模式的七大原則和UML類圖,我們通過具體的實例來展示如何在設計中使用這些原則,并通過類圖進行表達。

1. 單一職責原則與類圖

場景:在電商系統中,訂單管理模塊需要處理訂單的創建、更新和狀態跟蹤。

問題:如果訂單類既負責訂單的管理,又負責訂單狀態的跟蹤,會增加類的復雜性,違反單一職責原則。

解決方案:將訂單管理和狀態跟蹤分離到不同的類中。

類圖

@startuml
class Order {- id: String- items: List<Item>+ add_item(item: Item): void+ remove_item(itemId: String): void+ calculate_total(): float
}class OrderStatus {- status: String+ update_status(newStatus: String): void+ get_status(): String
}
@enduml

在這里插入圖片描述

通過這樣的設計,Order類專注于訂單的管理,OrderStatus類專注于訂單狀態的管理,符合單一職責原則。

2. 開放封閉原則與類圖

場景:在一個圖形繪制系統中,需要支持多種圖形的繪制,如圓形、矩形和三角形。

問題:如果每次新增圖形都需要修改現有的繪圖類,違反了開放封閉原則。

解決方案:通過定義一個繪制接口,讓不同的圖形類實現該接口。

類圖

@startuml
interface Drawable {+ draw(): void
}class Circle implements Drawable {+ draw(): void
}class Rectangle implements Drawable {+ draw(): void
}class Triangle implements Drawable {+ draw(): void
}class DrawingTool {+ drawShape(shape: Drawable): void {shape.draw()}
}
@enduml

在這里插入圖片描述

通過引入Drawable接口,DrawingTool無需修改即可支持新的圖形類型,符合開放封閉原則。

四、類圖在實際項目中的應用 🏗?

在設計模式和七大原則的應用中,UML類圖不僅僅是一種理論工具,它在實際項目中有著廣泛的應用。下面,我們將通過一個具體的案例來展示類圖的實際應用,并進行深度優化和擴展。

案例:在線圖書管理系統📚

背景:設計一個功能完善的在線圖書管理系統,支持用戶管理、圖書管理、借閱管理、權限控制和系統配置等功能。

系統功能

  1. 用戶角色管理(普通用戶、管理員、VIP用戶)
  2. 圖書分類與標簽管理
  3. 圖書借閱與歸還流程
  4. 借閱歷史記錄與統計
  5. 系統配置與權限控制
  6. 圖書搜索與推薦

分析
根據系統功能,可以將系統劃分為以下幾個主要模塊:

  • 用戶管理模塊(用戶注冊、登錄、角色管理)
  • 圖書管理模塊(圖書CRUD、分類、標簽)
  • 借閱管理模塊(借閱流程、歸還、逾期處理)
  • 權限管理模塊(角色權限控制)
  • 系統配置模塊(全局配置管理)

類圖設計

@startuml
' 用戶相關類
interface User {+ register(): void+ login(username: String, password: String): boolean+ logout(): void+ updateProfile(profile: UserProfile): void
}class RegularUser implements User {- username: String- password: String- email: String- profile: UserProfile+ register(): void+ login(username: String, password: String): boolean+ logout(): void+ updateProfile(profile: UserProfile): void
}class AdminUser implements User {- username: String- password: String- permissions: List<Permission>+ register(): void+ login(username: String, password: String): boolean+ logout(): void+ updateProfile(profile: UserProfile): void+ managePermissions(): void
}class VIPUser implements User {- username: String- password: String- vipLevel: int- expiryDate: Date+ register(): void+ login(username: String, password: String): boolean+ logout(): void+ updateProfile(profile: UserProfile): void+ getVipBenefits(): List<String>
}class UserProfile {- firstName: String- lastName: String- phone: String- address: String- joinDate: Date
}' 圖書相關類
class Book {- id: String- title: String- author: String- isbn: String- publisher: String- publishDate: Date- price: float- stock: int- category: BookCategory- tags: List<BookTag>- status: BookStatus
}class BookCategory {- id: String- name: String- parentCategory: BookCategory+ subCategories: List<BookCategory>
}class BookTag {- id: String- name: String+ relatedTags: List<BookTag>
}enum BookStatus {AVAILABLEBORROWEDRESERVEDLOSTMAINTENANCE
}' 借閱相關類
class BorrowRecord {- id: String- userId: String- bookId: String- borrowDate: Date- dueDate: Date- returnDate: Date- status: BorrowStatus- fineAmount: float
}enum BorrowStatus {ACTIVERETURNEDOVERDUELOST
}class Fine {- id: String- recordId: String- amount: float- dueDate: Date- paid: boolean
}' 系統管理相關類
class UserManager {+ registerUser(user: User): void+ loginUser(username: String, password: String): User+ logoutUser(userId: String): void+ updateUserProfile(userId: String, profile: UserProfile): void+ resetPassword(userId: String): void
}class BookManager {+ addBook(book: Book): void+ removeBook(bookId: String): void+ updateBook(book: Book): void+ searchBooks(keyword: String, filters: Map<String, String>): List<Book>+ getBookDetails(bookId: String): Book+ manageCategories(): void+ manageTags(): void
}class BorrowManager {+ borrowBook(userId: String, bookId: String): void+ returnBook(bookId: String): void+ renewBook(recordId: String): void+ getBorrowRecords(userId: String): List<BorrowRecord>+ calculateFine(recordId: String): float+ payFine(fineId: String): void
}class SystemConfig {- id: String- configKey: String- configValue: String- valueType: ConfigValueType+ updateConfig(key: String, value: String): void
}enum ConfigValueType {STRINGINTEGERBOOLEANFLOAT
}' 關系類
class Notification {- id: String- userId: String- message: String- type: NotificationType- isRead: boolean- createdAt: Date
}enum NotificationType {SYSTEMBORROWRETURNFINEPROMOTION
}' 類圖關系
UserManager "1" --> "many" User
BookManager "1" --> "many" Book
BorrowManager "1" --> "many" BorrowRecord
BorrowManager "1" --> "many" Fine
User "1" --> "many" BorrowRecord
Book "1" --> "many" BorrowRecord
Book "1" --> "1" BookCategory
BookCategory "0..*" <-- "0..*" BookCategory : has subcategories
Book "0..*" --> "0..*" BookTag
BookTag "0..*" --> "0..*" BookTag : related to
SystemConfig "1" --> "many" ConfigValueType
User "1" --> "many" Notification
BorrowRecord "1" --> "1" Notification : generates
Fine "1" --> "1" Notification : generatesnote for User "用戶基類接口\n定義所有用戶類型\n的公共方法"
note right for RegularUser "普通用戶\n具備基本借閱功能"
note right for AdminUser "管理員\n具備管理權限"
note right for VIPUser "VIP用戶\n享受特殊權益"
note for Book "包含圖書基本信息\n和狀態管理"
note for BookCategory "支持多級分類\n樹形結構"
note for BorrowRecord "記錄借閱詳情\n和狀態變更"
note for Fine "逾期罰款管理"
note for Notification "系統通知\n多種類型"@enduml

完整類圖:

在這里插入圖片描述

增強說明

  1. 用戶角色擴展
    • 新增VIP用戶角色,支持不同等級的會員權益
    • 用戶檔案類UserProfile分離,便于擴展用戶信息
  2. 圖書管理增強
    • 圖書分類支持多級樹形結構
    • 添加圖書標簽系統,支持多對多關聯
    • 圖書狀態枚舉,更精確管理圖書狀態
  3. 借閱流程完善
    • 借閱記錄狀態機設計,支持ACTIVE/RETURNED/OVERDUE/LOST
    • 罰款系統設計,關聯借閱記錄
    • 續借功能支持
  4. 系統管理擴展
    • 配置管理系統,支持不同類型的配置值
    • 通知系統,關聯多種事件類型
  5. 設計模式應用
    • 用戶角色采用策略模式,便于擴展新角色
    • 圖書分類采用組合模式,支持多級結構
    • 配置管理采用狀態模式,靈活處理不同類型配置
  6. UML增強細節
    • 添加類注釋note,說明設計意圖
    • 使用枚舉類型明確狀態和類型
    • 關系標注更清晰,如"has subcategories"
    • 接口與實現分離更明確

系統架構優勢

  1. 可擴展性
    • 新增用戶角色只需實現User接口
    • 新增圖書分類無需修改現有代碼
    • 新增通知類型只需擴展NotificationType枚舉
  2. 靈活性
    • 圖書狀態機設計支持復雜業務場景
    • 配置管理系統支持運行時修改
    • 多級分類支持靈活的圖書組織方式
  3. 可維護性
    • 職責分離清晰,各模塊獨立演化
    • 接口隔離原則應用,降低耦合度
    • 類型安全設計,減少運行時錯誤
  4. 業務支持
    • 完整的借閱生命周期管理
    • 靈活的權限控制體系
    • 全面的系統監控能力

這個增強版的類圖設計更加貼近實際項目的復雜需求,展示了如何通過UML類圖表達復雜的業務邏輯和系統架構。通過合理的類設計和關系定義,可以構建出既滿足當前需求又具備良好擴展性的系統架構。

五、總結與展望 🌟

設計模式的七大原則為我們的軟件設計提供了寶貴的指導,幫助我們構建靈活、可維護和可擴展的系統。而UML類圖作為一種可視化的建模工具,能夠有效地表達系統的結構和類之間的關系,是實現良好設計的重要輔助工具。

核心價值回顧

  1. 設計模式七大原則
    • 單一職責原則:確保每個類只負責一項明確的職責
    • 開放封閉原則:對擴展開放,對修改關閉
    • 里氏替換原則:子類必須能夠替換父類
    • 接口隔離原則:客戶端不應依賴不需要的接口
    • 依賴倒置原則:依賴抽象而非具體實現
    • 迪米特法則:最小化類之間的耦合
    • 組合/聚合復用原則:優先使用組合而非繼承
  2. UML類圖價值
    • 可視化系統架構
    • 明確類間關系
    • 支持團隊溝通
    • 輔助代碼生成
    • 文檔化系統設計

實際應用建議 📋

  1. 設計階段
    • 先繪制UML類圖規劃架構
    • 應用七大原則指導類設計
    • 標注關鍵類和接口
  2. 開發階段
    • 參考類圖實現代碼
    • 定期回顧設計是否符合原則
    • 使用工具自動生成部分代碼
  3. 維護階段
    • 通過類圖快速理解系統
    • 基于類圖進行重構
    • 使用類圖記錄變更歷史

進階實踐 🚀

  1. 模式組合應用
    • 結合工廠模式+策略模式實現靈活算法
    • 使用觀察者模式+模板方法實現事件驅動
    • 組合裝飾器模式+代理模式增強功能
  2. 工具鏈集成
    • PlantUML + Maven插件實現自動化文檔
    • StarUML + Git版本控制設計變更
    • ArchiMate + UML進行企業架構設計
  3. 質量保障
    • 設計評審時檢查原則符合度
    • 單元測試驗證接口契約
    • 靜態分析工具檢查耦合度

未來趨勢 🔮

  1. AI輔助設計
    • 自動生成類圖建議
    • 智能模式推薦
    • 設計缺陷檢測
  2. 云原生適配
    • 微服務架構下的設計原則演變
    • 云原生模式庫
    • 容器化設計模式
  3. 領域驅動設計(DDD)融合
    • 六邊形架構與七大原則結合
    • 聚合根設計實踐
    • 限界上下文劃分

希望本文能夠幫助你更好地理解和應用設計模式的七大原則,以及使用UML類圖進行系統設計。在后續的項目中,不妨嘗試將這些原則和工具融入到你的開發流程中,享受它們帶來的益處。記住,優秀的設計不是一蹴而就的,而是在實踐中不斷迭代和完善的結果。


圖標注釋

  • 類名使用class關鍵字定義
  • 屬性和方法在類內部以可見性 名稱: 類型表示
  • 關系使用不同的箭頭和線型表示
  • 多重性可以在連接線上使用數字或符號表示

關鍵詞:設計模式、七大原則、單一職責原則、開放封閉原則、里氏替換原則、接口隔離原則、依賴倒置原則、組合/聚合復用原則、UML類圖、系統設計、軟件工程

ML類圖規劃架構

  • 應用七大原則指導類設計
  • 標注關鍵類和接口
  1. 開發階段
    • 參考類圖實現代碼
    • 定期回顧設計是否符合原則
    • 使用工具自動生成部分代碼
  2. 維護階段
    • 通過類圖快速理解系統
    • 基于類圖進行重構
    • 使用類圖記錄變更歷史

進階實踐 🚀

  1. 模式組合應用
    • 結合工廠模式+策略模式實現靈活算法
    • 使用觀察者模式+模板方法實現事件驅動
    • 組合裝飾器模式+代理模式增強功能
  2. 工具鏈集成
    • PlantUML + Maven插件實現自動化文檔
    • StarUML + Git版本控制設計變更
    • ArchiMate + UML進行企業架構設計
  3. 質量保障
    • 設計評審時檢查原則符合度
    • 單元測試驗證接口契約
    • 靜態分析工具檢查耦合度

未來趨勢 🔮

  1. AI輔助設計
    • 自動生成類圖建議
    • 智能模式推薦
    • 設計缺陷檢測
  2. 云原生適配
    • 微服務架構下的設計原則演變
    • 云原生模式庫
    • 容器化設計模式
  3. 領域驅動設計(DDD)融合
    • 六邊形架構與七大原則結合
    • 聚合根設計實踐
    • 限界上下文劃分

希望本文能夠幫助你更好地理解和應用設計模式的七大原則,以及使用UML類圖進行系統設計。在后續的項目中,不妨嘗試將這些原則和工具融入到你的開發流程中,享受它們帶來的益處。記住,優秀的設計不是一蹴而就的,而是在實踐中不斷迭代和完善的結果。


圖標注釋

  • 類名使用class關鍵字定義
  • 屬性和方法在類內部以可見性 名稱: 類型表示
  • 關系使用不同的箭頭和線型表示
  • 多重性可以在連接線上使用數字或符號表示

關鍵詞:設計模式、七大原則、單一職責原則、開放封閉原則、里氏替換原則、接口隔離原則、依賴倒置原則、組合/聚合復用原則、UML類圖、系統設計、軟件工程

版權聲明:本文為原創內容,如需轉載,請注明出處。

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81440.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機視覺與深度學習 | Python實現ARIMA-LSTM時間序列預測(完整源碼和數據)

ARIMA-LSTM混合模型 1. 環境準備2. 數據生成(示例數據)3. 數據預處理4. ARIMA建模5. LSTM殘差建模6. 混合預測7. 結果可視化完整代碼說明1. **數據生成**2. **ARIMA建模**3. **LSTM殘差建模**4. **混合預測**5. **性能評估**參數調優建議擴展方向典型輸出以下是使用Python實現…

Docker部署單節點Elasticsearch

1.Docker部署單節點ES 1.前置條件 配置內核參數 echo "vm.max_map_count262144" >> /etc/sysctl.conf sysctl -w vm.max_map_count262144準備密碼 本文所有涉及密碼的配置&#xff0c;均使用通用密碼 Zzwl2024。 生產環境&#xff0c;請用密碼生成器生成20…

pe文件二進制解析(用c/c++解析一個二進制pe文件)

pe文件二進制解析 c解析pe文件控制臺版本 #include<iostream> #include<windows.h> #include<vector>/*RVA&#xff08;相對虛擬地址&#xff09;與FOA&#xff08;文件偏移地址&#xff09;的轉換1.得到 的值&#xff1a;內存地址 - ImageBase2.判斷是否位…

融智學視域下的系統性認知增強框架——基于文理工三類AI助理賦能HI四階躍遷路徑

融智學視域下的系統性認知增強框架 ——基于文理工三類AI助理賦能HI四階躍遷路徑 一、如何排除50個認知偏差&#xff1a;消除50類偏差的精準矯正系統 1. 技術架構 文科AI&#xff1a; 構建文化語義場&#xff08;Cultural Semantic Field, CSF&#xff09;&#xff0c;通過…

MMDetection環境安裝配置

MMDetection 支持在 Linux&#xff0c;Windows 和 macOS 上運行。它需要 Python 3.7 以上&#xff0c;CUDA 9.2 以上和 PyTorch 1.8 及其以上。 MMDetection 至今也一直更新很多個版本了&#xff0c;但是對于最新的pytorch版本仍然不支持&#xff0c;我安裝的時候仍然多次遇到m…

如何實現k8s高可用

一、控制平面高可用設計 多主節點部署 ? API Server 冗余&#xff1a;部署至少 3 個 Master 節點&#xff0c;每個節點運行獨立的 API Server&#xff0c;通過負載均衡器&#xff08;如 Nginx、HAProxy、云廠商 LB&#xff09;對外提供統一入口。 ? 選舉機制&#xff1a;Sche…

記錄心態和工作變化

忙中帶閑的工作 其實工作挺忙的, 總是在趕各種功能點. 好巧的是iOS那邊因為上架的問題耽擱了一些時間, 從而讓Android的進度有了很大的調整空間. 更巧的是后端那邊因為對客戶端的需求不是很熟悉, 加上Android海外這塊的業務他也是第一次接觸. 所以需要給他留一些時間把各個環節…

JVM 雙親委派機制

一、從 JDK 到 JVM&#xff1a;Java 運行環境的基石 在 Java 開發領域&#xff0c;JDK&#xff08;Java Development Kit&#xff09;是開發者的核心工具包。它不僅包含了編譯 Java 代碼的工具&#xff08;如 javac&#xff09;&#xff0c;還內置了 JRE&#xff08;Java Run…

java開發之異常

一 結構 Throwable分為Exception和error Exception分為RuntimeException&#xff08;運行時異常&#xff09;和其他異常 主動拋出運行時異常和非運行時異常的區別 1、throw RuntimeException&#xff08;或運行時異常的子類&#xff09; 編譯時不會報錯。 2、throw Excepti…

MySQL 中 JOIN 和子查詢的區別與使用場景

目錄 一、JOIN:表連接1.1 INNER JOIN:內連接1.2 LEFT JOIN:左連接1.3 RIGHT JOIN:右連接1.4 FULL JOIN:全連接二、子查詢:嵌套查詢2.1 WHERE 子句中的子查詢2.2 FROM 子句中的子查詢2.3 SELECT 子句中的子查詢三、JOIN 和子查詢的區別3.1 功能差異3.2 性能差異3.3 使用場…

2025年第三屆盤古石杯初賽(智能冰箱,監控部分)

前言 所以去哪里可以取到自己家里的智能家居數據呢&#xff1f;&#xff1f;&#xff1f;&#xff1f; IOT物聯網取證 1、分析冰箱&#xff0c;請問智能冰箱的品牌&#xff1f; [答案格式&#xff1a;xiaomi] Panasonic2、請問智能冰箱的型號&#xff1f; [答案格式&#x…

【強化學習】強化學習算法 - 馬爾可夫決策過程

文章目錄 馬爾可夫決策過程 (Markov Decision Process, MDP)1. MDP 原理介紹2. MDP 建模/實現步驟3. MDP 示例&#xff1a;簡單網格世界 (Grid World) 馬爾可夫決策過程 (Markov Decision Process, MDP) 1. MDP 原理介紹 馬爾可夫決策過程 (MDP) 是強化學習 (Reinforcement L…

用戶現場不支持路由映射,如何快速將安防監控EasyCVR視頻匯聚平臺映射到公網?

一、方案背景? 隨著數字化安防與智能交通管理發展&#xff0c;視頻監控遠程管理需求激增。EasyCVR作為專業視頻融合平臺&#xff0c;具備多協議接入等核心功能&#xff0c;是智能監控的重要工具。但實際部署中&#xff0c;當EasyCVR處于內網且路由器無法進行端口映射時&#…

MODBUS RTU調試助手使用方法詳解

一、軟件簡介 485調試助手是一款常用的串口通信調試工具&#xff0c;專門用于RS-485總線設備的測試、調試和通信監控。它支持多種串口參數設置&#xff0c;提供數據收發功能&#xff0c;是工業現場調試的必備工具之一。 二、軟件安裝與啟動 1. 系統要求 Windows 7/10/11操作…

ECMAScript 2018(ES2018):異步編程與正則表達式的深度進化

1.版本背景與發布 發布時間&#xff1a;2018年6月&#xff0c;由ECMA International正式發布&#xff0c;標準編號為ECMA-262 9th Edition。歷史意義&#xff1a;作為ES6之后的第三次年度更新&#xff0c;ES2018聚焦于異步編程、正則表達式和對象操作的標準化&#xff0c;推動…

【C語言】鏈接與編譯(編譯環境 )

前言&#xff1a; 在前面講解文件操作&#xff0c;了解了文件的類別&#xff0c;文件的打開與關閉&#xff0c;字符讀寫函數&#xff0c; 字符串讀寫函數&#xff0c;格式化輸入輸出函數 在C語言編程中&#xff0c;編譯與鏈接是將源代碼轉化為可執行程序的關鍵步驟。為了詳細…

Java視頻流RTMP/RTSP協議解析與實戰代碼

在Java中實現視頻直播的輸入流處理&#xff0c;通常需要結合網絡編程、多媒體處理庫以及流媒體協議&#xff08;如RTMP、HLS、RTSP等&#xff09;。以下是實現視頻直播輸入流的關鍵步驟和技術要點&#xff1a; 1. 視頻直播輸入流的核心組件 網絡輸入流&#xff1a;通過Socket或…

系分論文《論系統需求分析方法及應用》

系統分析師論文范文系列 【摘要】 2022年6月&#xff0c;我作為系統分析師參與了某金融機構“智能信貸風控系統”的建設項目。該系統旨在通過對業務流程的數字化重構&#xff0c;優化信貸審批效率并降低風險。項目涉及信貸申請、資質審核、風險評估、額度審批等核心流程&#x…

stack和queue簡單模擬實現

stackreverse_iteratorqueuepriority_queue仿函數具體代碼 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…

Linux內核可配置的參數

sysctl -a 命令會列出當前Linux內核所有可配置的參數及其當前值。這些參數允許你在系統運行時動態地調整內核的行為&#xff0c;而無需重新編譯內核或重啟系統。 內容非常多&#xff0c;因為內核有很多可調的方面。我們可以把它們大致分為幾個主要類別&#xff1a; kernel.*: …