# 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 黑白棋