設計模式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
類重寫了setWidth
和setHeight
方法,導致無法正確計算面積,破壞了繼承關系。
遵循里氏替換原則的類圖:
@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
將Rectangle
和Square
都作為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
Bird
和Fish
都實現了fly
和swim
方法,但實際上Fish
不需要飛行功能,Bird
不需要游泳功能。
遵循接口隔離原則的類圖:
@startuml
interface Flyable {+ fly(): void
}interface Swimmable {+ swim(): void
}class Bird implements Flyable {+ fly(): void
}class Fish implements Swimmable {+ swim(): void
}
@enduml
通過將接口拆分為Flyable
和Swimmable
,讓不同的類只實現它們需要的接口。
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
類直接依賴于Department
和Professor
類的內部實現。
遵循迪米特法則的類圖:
@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類圖不僅僅是一種理論工具,它在實際項目中有著廣泛的應用。下面,我們將通過一個具體的案例來展示類圖的實際應用,并進行深度優化和擴展。
案例:在線圖書管理系統📚
背景:設計一個功能完善的在線圖書管理系統,支持用戶管理、圖書管理、借閱管理、權限控制和系統配置等功能。
系統功能:
- 用戶角色管理(普通用戶、管理員、VIP用戶)
- 圖書分類與標簽管理
- 圖書借閱與歸還流程
- 借閱歷史記錄與統計
- 系統配置與權限控制
- 圖書搜索與推薦
分析:
根據系統功能,可以將系統劃分為以下幾個主要模塊:
- 用戶管理模塊(用戶注冊、登錄、角色管理)
- 圖書管理模塊(圖書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
完整類圖:
增強說明:
- 用戶角色擴展:
- 新增VIP用戶角色,支持不同等級的會員權益
- 用戶檔案類
UserProfile
分離,便于擴展用戶信息
- 圖書管理增強:
- 圖書分類支持多級樹形結構
- 添加圖書標簽系統,支持多對多關聯
- 圖書狀態枚舉,更精確管理圖書狀態
- 借閱流程完善:
- 借閱記錄狀態機設計,支持
ACTIVE/RETURNED/OVERDUE/LOST
- 罰款系統設計,關聯借閱記錄
- 續借功能支持
- 借閱記錄狀態機設計,支持
- 系統管理擴展:
- 配置管理系統,支持不同類型的配置值
- 通知系統,關聯多種事件類型
- 設計模式應用:
- 用戶角色采用策略模式,便于擴展新角色
- 圖書分類采用組合模式,支持多級結構
- 配置管理采用狀態模式,靈活處理不同類型配置
- UML增強細節:
- 添加類注釋note,說明設計意圖
- 使用枚舉類型明確狀態和類型
- 關系標注更清晰,如
"has subcategories"
- 接口與實現分離更明確
系統架構優勢:
- 可擴展性:
- 新增用戶角色只需實現User接口
- 新增圖書分類無需修改現有代碼
- 新增通知類型只需擴展
NotificationType
枚舉
- 靈活性:
- 圖書狀態機設計支持復雜業務場景
- 配置管理系統支持運行時修改
- 多級分類支持靈活的圖書組織方式
- 可維護性:
- 職責分離清晰,各模塊獨立演化
- 接口隔離原則應用,降低耦合度
- 類型安全設計,減少運行時錯誤
- 業務支持:
- 完整的借閱生命周期管理
- 靈活的權限控制體系
- 全面的系統監控能力
這個增強版的類圖設計更加貼近實際項目的復雜需求,展示了如何通過UML類圖表達復雜的業務邏輯和系統架構。通過合理的類設計和關系定義,可以構建出既滿足當前需求又具備良好擴展性的系統架構。
五、總結與展望 🌟
設計模式的七大原則為我們的軟件設計提供了寶貴的指導,幫助我們構建靈活、可維護和可擴展的系統。而UML類圖作為一種可視化的建模工具,能夠有效地表達系統的結構和類之間的關系,是實現良好設計的重要輔助工具。
核心價值回顧
- 設計模式七大原則:
- 單一職責原則:確保每個類只負責一項明確的職責
- 開放封閉原則:對擴展開放,對修改關閉
- 里氏替換原則:子類必須能夠替換父類
- 接口隔離原則:客戶端不應依賴不需要的接口
- 依賴倒置原則:依賴抽象而非具體實現
- 迪米特法則:最小化類之間的耦合
- 組合/聚合復用原則:優先使用組合而非繼承
- UML類圖價值:
- 可視化系統架構
- 明確類間關系
- 支持團隊溝通
- 輔助代碼生成
- 文檔化系統設計
實際應用建議 📋
- 設計階段:
- 先繪制UML類圖規劃架構
- 應用七大原則指導類設計
- 標注關鍵類和接口
- 開發階段:
- 參考類圖實現代碼
- 定期回顧設計是否符合原則
- 使用工具自動生成部分代碼
- 維護階段:
- 通過類圖快速理解系統
- 基于類圖進行重構
- 使用類圖記錄變更歷史
進階實踐 🚀
- 模式組合應用:
- 結合工廠模式+策略模式實現靈活算法
- 使用觀察者模式+模板方法實現事件驅動
- 組合裝飾器模式+代理模式增強功能
- 工具鏈集成:
- PlantUML + Maven插件實現自動化文檔
- StarUML + Git版本控制設計變更
- ArchiMate + UML進行企業架構設計
- 質量保障:
- 設計評審時檢查原則符合度
- 單元測試驗證接口契約
- 靜態分析工具檢查耦合度
未來趨勢 🔮
- AI輔助設計:
- 自動生成類圖建議
- 智能模式推薦
- 設計缺陷檢測
- 云原生適配:
- 微服務架構下的設計原則演變
- 云原生模式庫
- 容器化設計模式
- 領域驅動設計(DDD)融合:
- 六邊形架構與七大原則結合
- 聚合根設計實踐
- 限界上下文劃分
希望本文能夠幫助你更好地理解和應用設計模式的七大原則,以及使用UML類圖進行系統設計。在后續的項目中,不妨嘗試將這些原則和工具融入到你的開發流程中,享受它們帶來的益處。記住,優秀的設計不是一蹴而就的,而是在實踐中不斷迭代和完善的結果。
圖標注釋:
- 類名使用
class
關鍵字定義 - 屬性和方法在類內部以
可見性 名稱: 類型
表示 - 關系使用不同的箭頭和線型表示
- 多重性可以在連接線上使用數字或符號表示
關鍵詞:設計模式、七大原則、單一職責原則、開放封閉原則、里氏替換原則、接口隔離原則、依賴倒置原則、組合/聚合復用原則、UML類圖、系統設計、軟件工程
ML類圖規劃架構
- 應用七大原則指導類設計
- 標注關鍵類和接口
- 開發階段:
- 參考類圖實現代碼
- 定期回顧設計是否符合原則
- 使用工具自動生成部分代碼
- 維護階段:
- 通過類圖快速理解系統
- 基于類圖進行重構
- 使用類圖記錄變更歷史
進階實踐 🚀
- 模式組合應用:
- 結合工廠模式+策略模式實現靈活算法
- 使用觀察者模式+模板方法實現事件驅動
- 組合裝飾器模式+代理模式增強功能
- 工具鏈集成:
- PlantUML + Maven插件實現自動化文檔
- StarUML + Git版本控制設計變更
- ArchiMate + UML進行企業架構設計
- 質量保障:
- 設計評審時檢查原則符合度
- 單元測試驗證接口契約
- 靜態分析工具檢查耦合度
未來趨勢 🔮
- AI輔助設計:
- 自動生成類圖建議
- 智能模式推薦
- 設計缺陷檢測
- 云原生適配:
- 微服務架構下的設計原則演變
- 云原生模式庫
- 容器化設計模式
- 領域驅動設計(DDD)融合:
- 六邊形架構與七大原則結合
- 聚合根設計實踐
- 限界上下文劃分
希望本文能夠幫助你更好地理解和應用設計模式的七大原則,以及使用UML類圖進行系統設計。在后續的項目中,不妨嘗試將這些原則和工具融入到你的開發流程中,享受它們帶來的益處。記住,優秀的設計不是一蹴而就的,而是在實踐中不斷迭代和完善的結果。
圖標注釋:
- 類名使用
class
關鍵字定義 - 屬性和方法在類內部以
可見性 名稱: 類型
表示 - 關系使用不同的箭頭和線型表示
- 多重性可以在連接線上使用數字或符號表示
關鍵詞:設計模式、七大原則、單一職責原則、開放封閉原則、里氏替換原則、接口隔離原則、依賴倒置原則、組合/聚合復用原則、UML類圖、系統設計、軟件工程
版權聲明:本文為原創內容,如需轉載,請注明出處。