最後編輯時間:2020.4.14《例解OOD(Java8)》
通過若干典型的實驗例子,引入並介紹面向對象設計的基本原理和設計模式。通過解決問題而“獲得”設計模式,以掌握設計模式的本質、揭示設計模式之間的內在聯繫;以期解決學習設計模式的知易行難困境。
上機題。
三門語言的編程環境 -Pelles c、DrRacket和BlueJ
第0章 基礎
本書討論面向對象(的軟件)設計(Object Orientation Design、OOD),而本章將介紹學習OOD之前應該打下的基礎。
作爲學習OOD的基礎,讀者應該掌握兩部分內容。首先必須理解編程語言;其次必須理解編程範式。此外,在長期的設計實踐中,人們總結或歸納出諸多的經驗,這些經驗,有些被稱爲設計原則——軟件設計時需要遵循的一系列理想化的原則;有些被稱爲設計模式——設計中可複用的各種(軟件)結構。本章將簡要介紹相關內容,並在後續章節中深入探討。
0.1編程語言的掌握
- 0.1.1 編程類課程的問題 理解編程語言
- 0.1.2 行爲抽象
- 0.1.3 關於循環
- 0.1.4 數據抽象
- 0.1.5 對象抽象——PLP 何謂面向對象編程範式(Object Orientation paradigm ) 面向對象編程範式是以柏拉圖原則、Liskov原則和Parnas原則(合稱PLP-腦圖)爲基石構建的面向對象範式的邏輯體系。
0.2 編程範式
0.3 PLP詳解
0.4 設計原則
0.5 關於本書的若干說明
第1章 技術與概念
軟件設計,特別是面向對象設計/OOD領域,充滿概念,而且十分混亂。如果要建立 OOD 的完整的邏輯體系,就需要梳理各種概念,澄清一些錯誤的認識。(拍到什麼程度)
本章的焦點是回調機制,通過一個例子的多種語言的實現,說明各種編程語言的核心技術;隨後說明OOD中常用的若干術語的真實含義。
1.1回調機制
- 1.1.1什麼是框架
- 1.1.2回調機制的實現
- 1.1.3回調函數
- 1.1.4匿名類和λ表達式
1.2好萊塢法則
- 1.2.1輪詢VS. 通知
- 1.2.2 什麼是好萊塢法則
- 1.2.3 觀察者模式
1.3何謂控制反轉
1.4依賴抽象類型
1.5 本章小結
第2章 行爲參數化
本章介紹行爲參數化相關的議題。包括爲什麼需要行爲參數化、模板方法模式(5.10)和高階函數等內容。
2.1 可變的需求被參數化 實驗2.行爲參數化
2.2 模板方法模式(5.10)
- 2.2.1求和函數
- 2.2.2策略模式的擴展
- 2.3.3不要教條主義
- 2.3.4更強的通用性 累積函數
2.3 高階函數
2.4 Java8函數接口簡介
第3章 創建對象
3.1 工具God
- 3.1.1不得使用new
- 3.1.2 針對接口編程的使能工具God 工具類God
3.2依賴注入容器
- 3.2.1 God Vs. Spring Spring工具的簡單使用
- 3.2.2什麼是依賴注入 依賴注入容器
- 3.2.3注入的方式
- 3.2.4增強God
3.3工廠模式
- 3.3.1參數化工廠模式 2.1.1 簡單工廠模式
- 3.3.2工廠方法模式(3.3) 2.1.2 工廠方法模式(3.3) 靜態工廠模式的enum實現
- 3.3.3 抽象工廠模式(3.1)
3.4 零例、單例和對象池
第4章 策略模式的演化
在[第二章行爲參數化2.2模板方法模式(5.10)]中,通過設計求和函數,介紹了策略模式的擴展。在例程2-3中solve(int x, Condition c)採用了策略模式;而模板方法中參數可以變成多個,模板方法模式(5.10)因此作爲策略模式的推廣。
模板方法模式中多個策略選擇是並聯,即彼此互不干涉;而橋接模式也使用了多重策略,但屬於串聯,一個策略選擇融爲另外一個策略選擇的一部分。
本章...
4.1 命令模式(5.2)
- 4.1.1 傻傻的幸福
- 4.1.2 命令模式與行爲參數化
- 4.1.3 萬能的適配目標?
- 4.1.4 適配器模式(4.1)
4.2 橋接模式
4.3更加濃郁的函數式風格
- 4.3.1複合函數 實驗5 複合函數
第5章 封閉性操作
5.1 自引用模型
- 5.1.1 結點
- 5.1.2 自然數和丘奇數
5.2 裝飾模式 5.5 裝飾模式(4.4)
5.3 數據結構型模式
- 責任鏈模式 6.1 責任鏈模式(5.1)
- 組合模式 6.2 組合模式(4.3)
- 6.3 迭代器模式 略
5.4 鏈式賦值和操作
第6章 表達式問題
表達式問題(The Expression Problem或擴展性問題the extensibility problem)是編程語言領域的一個根本性的兩難困境。
本章通過Java模擬雙分派(double dispatch),討論表達式問題,並自然地獲得訪問者模式,從而認識訪問者模式的本質;然後通過解釋器模式(5.3)進一步理解表達式問題。
6.1Java模擬雙分派 【6.1.1分派/動態綁定/6.1.2命令和執行/6.1.3合併Shape和命令/6.1.4形狀的行爲與訪問者的類型 】
6.2訪問者模式(5.11) 【6.2.1表達式問題 6.2.2對象結構】
6.3解釋器模式(5.3) 7.1 解釋器模式 解釋器模式 2 中序表達式 to 後序表達式
- 6.3.1乘法解釋器
- 6.3.2 Expr的新子類
- 6.3.3 Expr的新操作
第7章 LoD
第8章 數據型模式
yqj2065的講義,一直會調整。
第0章 基礎
0.1 面向對象編程範式 腦圖
0.1.3 Parnas原則 (接口與實現分離) 《編程導論(Java)·6.1封裝性》
0.2 設計原則概述
0.2.1 開放封閉原則 (類的OCP,參見第2章。函數的OCP,參見第3章。)
第1章 抽象依賴原則
2.3.4 配置文件Vs. 標註 @ 增強tool.God @
2.3.5 工廠模式 準備將2.1.3 抽象工廠模式(3.1) 壓縮爲一節。
2.4 其他創建型模式
2.4 .1裝配廠模式 2.2.1 僞建造者模式
2.2.2 建造者模式(3.2)
2.2.3 串接式setter模式 略2.4.3 原型模式(3.4)
第4章 行爲參數化
值參數化 4.1.2 強大的動態綁定 4.1.3 行爲參數化 4.1.4 回調機制(Call back)
4.1單向依賴原則 @好萊塢原則 最簡單的Java框架
4.3模板方法模式 @傳統模板方法模式(5.10) +顯式回調 腦圖
4.4 橋接模式(4.2)4.6 觀察者模式(5.7)
5.3 5.3.3 可插入的適配器(Pluggable Adapter)
3.4 命令模式(5.2) 命令模式之2 Invoker Vs. Client 模擬雙分派 命令模式(5.2)的結構推導
3.5 訪問者模式(5.11) 訪問者模式的意圖 訪問者模式與雙分派 訪問者模式(5.11)之對象結構 訪問者模式-好人打賤人(這麼分散!)
3.7 Null對象 略
第5章 屬性型模式
4.1虛域模式 略
4.3享元模式(4.6)
4.2 狀態模式(5.8) 有限狀態機
第6章 委派型模式 154
5.1 小方法模式 略
5.2 代理模式(4.7)
5.2.1保護型代理(protection proxy) 106
5.2.2動態代理(dynamic proxy) 106
5.2.3 Java RMI (Remote Method Invocation,遠程方法調用) 106
第9章 回顧 338
附錄
附錄A Astah Community
附錄B 模式映射表
附錄C參考資料
在講授“信息系統分析與設計”課程的時候,需要介紹一些設計模式;又由於在[編程導論]出版過程中,清華大學出版社的魏江江主任給我寄來了兩本設計模式方面的書籍,因而yqj2065決定將設計模式方面的知識全面梳理一番。
①推導出常用的設計模式。
GoF在[設計模式•引言]中寫道:“這本書的目的就是將面向對象軟件的設計經驗作爲設計模式記錄下來”。這種“記錄”或者說歸納,對於廣大程序員成功地共享設計經驗作出了重大貢獻。然而,將設計模式作爲前輩的經驗總結或者既定事實,對於學習設計模式,特別是能夠靈活使用設計模式是一個錯誤的誘導。許多設計模式的學習者如同拿一本字典學習英語一樣。
本系列的基本方法是從各種假定出發,通過重構源代碼或者遵循設計原則的編寫源代碼,以獲得設計模式。
雖然有點像作弊——知道最終結果的推導和證明,然而在推導的過程中,我們能夠看到一個模式更多的變化、能夠知道一個模式的優缺點/適應性、能夠知道一個模式與其他模式的思路上的關聯(而不是UML類圖結構上的形似)。
②解釋更清晰和簡明。這是站在巨人的肩膀上,對巨人的經典加以吹毛求疵。
以我對面向對象的認識,[設計模式]中有許多解釋顯得晦澀、不嚴密、甚至錯誤。一個典型的例子是[設計模式]使用回調/好萊塢法則解釋模板方法模式(5.10),而在我看來,觀察者模式則是回調/好萊塢法則的簡單推論。[設計模式]對橋接模式(4.2)的解說非常難解。再例如,我認爲備忘錄模式(5.6)Memento對象可以是不變對象,不必要強調“封裝性”。
③補充常用的模式。如依賴注入等。
④以內在的聯繫,將若干模式串聯起來...
2017.02.20:上課期間,本導航會改爲面向對象設計(Java),彙集20:16-2017-1學期的教學資料(32授課學時+12上機學時)。重新修改了許多博文內容。
(yqj2065提示:不時編輯中,轉載請謹慎。歡迎拍磚。)
1.強烈建議學習設計模式(Java)時使用BlueJ。相關博文中,我不想畫UML圖而是採用BlueJ的界面截圖。
2.強烈建議學習設計模式時,除了文中列出的代碼外,請你自己動手敲未列出的代碼。