---
# System prepended metadata

title: 7. 物件導向的設計 - 設計模式

---

# 7. 物件導向的設計 - 設計模式

### SOLID

1. S: Single responsibility principle(SRP) 單一職責

2. O: Open/close principle(OCP) 開放/封閉原則
物件導向程式設計最重要的開放（擴充）封閉（修改）原則。一套軟體應該要保留彈性，可以擴充新功能，但如果裡面程式碼的耦合度（Coupling）過高，新增功能時可能會影響舊功能，甚至會造成程式Bug，因此增新功能時就必須很小心仔細以原本正常程式碼被改壞了，另外高耦合的程式碼在有Bug需要維護修改也是同樣的麻煩。有鑑於此，舊程式碼應該是封閉修改的，或是某個舊功能需要調整，也不應該取影響到其他功能。

3. L: Liskov substitution principle(LSP) Liskov替換
 ![](https://i.imgur.com/lTDO63k.png)


4. I: Interface Segregation Principle(ISP) 介面隔離
![](https://i.imgur.com/Ah92bmu.png)


5. D: Dependency Inversion Principle(DIP) 依賴反轉
定義：高階模組不應依賴低階模組，兩個都應該依賴在抽象概念上；抽象概念不依賴細節，而是細節依賴在抽象概念。
上面這段文字看起來很抽象，讓我來翻譯翻譯，意思就是「話不能說的太死，盡量講一些概念性的東西」。

參考文獻： https://skyyen999.gitbooks.io/-study-design-pattern-in-java/content/oodPrinciple.html


### 7-5~7-8的測驗題

#### 7.5 線上閱讀
設計線上閱讀系統的資料結構
這邊假設要設計的是提供下列功能的基本線上閱讀系統

* 加入會員與續約
* 搜尋圖書資料庫
* 閱讀
* 每次只有一個使用者
* 該使用者每次只能讀一本書

#### 7.6 拼圖
實作NxN拼圖。設計資料結構與演算法。
* 先了解每一片都有列與欄的位置與四個邊。
* 邊有三種： 凹 凸 平
* 角落的拼圖有兩個屏邊與兩格其他類型的邊
* 使用絕對位置
* 需要列舉不同的邊與方向

#### 7.7 聊天室
說明如何設計聊天伺服器，特別是各種後台元件、類別、與方向的細節
* 登入與登出
* 請求(發出、接受、與拒絕)
* 更新狀態
* 開啟群組或私人交談
* 發送訊息給群組與個人

#### 7.8 黑白棋





