標籤:
1. 設計模式的重要性
1.1 設計模式解決的是在軟體過程中如何來實現具體的軟體功能。實現同一個功能的方法有很多,哪個設計容易擴充,容易複用,松耦合,可維護?設計模式指導我們找到最優方案。
1.2 設計中往往會存在設計缺陷,這些缺陷包括:
僵化性:難以對軟體進行改動,即使在功能上來看是很小的改動
脆弱性:在進行很小的改動時,可能導致很多地方出現問題
頑固性:要把系統中某些通用的功能分離出來的努力和風險非常巨大
粘滯性:當面臨改動時,改動的方案有很多,一些會保持設計,一些會破壞設計,當採用保持設計的方法比用破壞設計的方法更難應付變化時,說明原設計具有較高的粘滯性
晦澀性:模組難以理解
不必要的重複:代碼不能複用,往往通過Copy-Paste來實現相似功能
不必要的複雜性:設計中包含了沒有用的成分,往往是過度設計導致的
1.3 如果你覺得在開發過程中發現以上問題(缺陷),那麼就需要使用設計模式來改善最初設計,即重構原有的設計。如果你是最初的設計者,那麼也需要應用設計模式來找到一個最優方案。設計模式不是程式設計語言,它修鍊的是程式員的內功。因此,對於一個開發人員來說,學習設計模式是非常必要的。
2. 對於初學者來說,必要的知識準備還是必須的,沒有這些基礎就很難將這些理解透徹。
2.1 物件導向基本知識
設計模式是物件導向編程的設計指導,因此學習設計模式前先要理解什麼是物件導向,這裡只簡單列出了物件導向的主要概念,要是初學者的話還得查閱相關資料;對已經瞭解的老手來說,權當複習和梳理一下吧。
2.1.1 物件導向三大特徵:封裝、繼承、多態
2.1.2 類與執行個體
2.1.3 構造(析構)方法
2.1.4 重載
2.1.5 存取修飾詞
2.1.6 屬性/欄位/方法
2.1.7 抽象類別
2.1.8 介面
2.2 UML類圖
在學習設計模式時,通常接觸到的只有類圖,因此讀懂UML類圖對完整模式來說有很大協助。下面來介紹UML類圖中的關係
2.2.1 依賴關係(Dependency),用虛線加箭頭表示。如動物(Animal)依賴空氣(Air)。表示依賴關係的代碼有以下幾種
1)作為參數
public class Air { public void GetOxygen() { Console.WriteLine("Get oxygen from air."); } } public abstract class Animal { /// <summary> /// 動物依賴空氣才能呼吸,作為參數傳入 /// </summary> /// <param name="air"></param> public void Breathe(Air air) { air.GetOxygen(); } }
2)在方法內部定義
/// <summary> /// 動物依賴空氣才能呼吸,在方法內部執行個體化新對象 /// </summary> public void Breathe() { Air air = new Air(); air.GetOxygen(); }
3)靜態方法調用
/// <summary> /// 在方法中調用靜態方法 /// </summary> public void Test() { ClassName.UseStaticMethode(); }
2.2.2 繼承關係(Inherit),用實線加空心箭頭表示,如鷹(Eagle)繼承自動物(Animal)
/// <summary> /// 鷹繼承自Animal /// </summary> public class Eagle : Animal { }
2.2.3 實現關係(Realize),用虛線加空心箭頭表示,如鷹(Eagle)實現了飛行能力(IFlyAble)
/// <summary> /// 鷹繼承自Animal /// </summary> public class Eagle : Animal, IFlyAble { //實現IFlyAble介面中定義的方法 public void Fly() { Console.WriteLine("老鷹可以飛翔。"); } }
2.2.4 組合關係,講組合關係之前不得不談關聯關係與彙總關係
1)關聯關係(Association):對於兩個相對獨立的對象,當一個對象執行個體與另一個對象的一些特定執行個體存在固定的對應關係時,這兩個對象之間的關係為關聯關係。例如:公司與員工的關係
代碼錶現,通過執行個體欄位或屬性來實現
public class Emplolyee { public string Name{ get; set; } } public class Company { /// <summary> /// 一個公司可以有多個員工 /// </summary> private Emplolyee[] employees; }
2) 彙總關係(Aggregate): 是關聯關係的一種,是一種較強的關聯關係,強調整體與部分之間的關係。例如:電腦與顯示器的關係,就是整體與部分的關係,即彙總關係
代碼錶現,也是通過執行個體欄位或屬性來實現
public class Displayer { /// <summary> /// 顯示器型號 /// </summary> public string Model { get; set; } } public class Computer { /// <summary> /// 通過欄位表示彙總關係 /// </summary> private Displayer displayer; }
3)組合關係,組合關係是彙總的一種特殊形式,表示一個所有物執行個體不能同時被兩個所有物所擁有。如上例:鷹擁有一對翅膀,它的翅膀不能同時屬於別的鷹。
代碼錶現,也是通過執行個體欄位或屬性來實現
public class Wing { } /// <summary> /// 鷹繼承自Animal /// </summary> public class Eagle : Animal, IFlyAble { private Wing leftWing; private Wing rightWing; public Eagle() { // 在建構函式中執行個體化翅膀,防止翅膀被改變 leftWing = new Wing(); rightWing = new Wing(); } public void Fly() { Console.WriteLine("老鷹可以飛翔。"); } }
關聯關係與彙總關係的區別: 關聯關係所涉及的兩個對象是處在同一個層次上的,比如程式員和電腦的關係就是一種關聯關係,而不是彙總關係,因為程式員不是由電腦群組成的。彙總關係涉 及的兩個對象處於不平等的層次上,一個代表整體,一個代表部分。如電腦與顯示器的關係就是聚集關係,因為顯示器是電腦的一部分。
彙總關係與組合關係的區別:彙總關係中處於被持有的對象,可以被別的對象所持有。如多態電腦可以共用同一個顯示器。組合關係中被持有的對象只能被一個對象引用,不能共用給其它對象;而且被持有的對象的生命週期也由所有者控制,當所有者析構了,其所有物必須隨著它一起析構。
設計模式學習筆記-基礎知識篇