天天看點

C#基礎系列——委托和設計模式(二)

前言:前篇 C#基礎系列——委托實作簡單設計模式 簡單介紹了下委托的定義及簡單用法。這篇打算從設計模式的角度去解析下委托的使用。我們知道使用委托可以實作對象行為(方法)的動态綁定,進而提高設計的靈活性。上次說過,方法可以了解為委托的執行個體,站在方法的層面,委托執行個體的一個非常有用的特性是它既不知道,也不關心其封裝方法所屬類的詳細資訊,對它來說最重要的是這些方法與該委托的參數和傳回值的相容性。即隻要方法的傳回類型和參數表是相同的,則方法與委托類型相容,方法的名稱及方法所屬類等資訊委托是不關心的。有一定程式設計經驗的大俠們肯定都接觸過設計模式,其實設計模式大多數都是面向對象多态特性的展現,通過重寫子類方法去展現不同的設計需求,這樣看,既然是方法重寫,那麼方法的參數類型和傳回值類型肯定是一緻的,這是不是和委托的執行個體十分相似,這樣說來,我們通過多态去實作的設計模式是否可以用委托的形式去代替。部落客覺得,為了更好的了解委托,可以從這方面着手試試。。。

  時間過得真快,轉眼C#基礎系列已經寫了8篇随筆了,不管寫的好不好,部落客都會繼續,做事要有始有終嘛~~前天在園子看到一篇文章目錄的博文,這裡将部落客的系列文章也列一個目錄出來,這樣以後找起來也友善。

C#基礎系列——Linq to Xml讀寫xml

C#基礎系列——擴充方法的使用

C#基礎系列——序列化效率比拼

C#基礎系列——反射筆記

C#基礎系列——Attribute特性使用

C#基礎系列——小話泛型

C#基礎系列——多線程的常見用法詳解

C#基礎系列——委托和設計模式(一)

C#基礎系列——委托和設計模式(二)

  此篇簡單抽取了幾個設計模式分别按照多态和委托的方式去實作,當然這裡的重點并不是講設計模式,而是為了使讀者更好地了解委托。是以設計模式的很多細節,本篇可能會略過。

一、簡單工廠模式:本篇就借助電腦的例子加以說明。

1、多态實作簡單工廠模式。

代碼應該很容易看懂,直接通過方法的重寫去實作,在此就不過多講解。

2、委托方式實作簡單工廠模式。

這裡需要定義四個實作方法Add、Subtract、Multiply、Divide,而不用在意這四個方法在哪個類下面,隻要這四個方法的的參數和傳回值和委托的定義保持一緻即可。這也驗證了上面說的 “站在方法的層面,委托執行個體的一個非常有用的特性是它既不知道,也不關心其封裝方法所屬類的詳細資訊,對它來說最重要的是這些方法與該委托的參數和傳回值的相容性” 。兩種方式得到的結果是相同的:

C#基礎系列——委托和設計模式(二)

二、觀察者模式:觀察者模式最典型的場景就是訂閱者和訂閱号的場景

1、純多态方式實作觀察者模式:這種代碼園子裡面非常多。

可以看到雖然已經很好的實作了觀察者Observer 和主題Subject之間的分離。但是Subject的内部還是有對觀察者的調用:

2、多态和委托實作觀察者模式。

得到結果:

C#基礎系列——委托和設計模式(二)

這樣設計的優勢:

(1)将通知的方法Update通過委托的形式傳入主題對象。這樣主題對象Subject就完全和觀察者隔離。更好地實作了低耦合。

(2)減少了觀察者抽象類的定義。使整個設計更加精簡。

(3)如果将設計更進一步,觀察者這邊自定義delegate void ObserverDelegate()這種類型的方法。比如需要執行Update()方法之後還要記錄一個日志的操作。如:

那麼在用戶端調用時隻需要将Log方法以委托的形式傳入即可:

是不是顯得更靈活一點。如果是純多态的方式,由于Subject裡面指定了調用Update()方法,是以當需要增加Log方法的時候代碼的改變量要大。

三、模闆方法模式,這裡就以裝置采集為例來進行說明:

1、多态實作模闆方法模式:

父類裡面的非abstract方法都是模闆方法,也就是子類公用并且不可以重寫的方法。SpiderType1和SpiderType2是需要子類重寫的方法。模闆方法模式在抽象類中定義了算法的實作步驟,将這些步驟的實作延遲到具體子類中去實作,進而使所有子類複用了父類的代碼,是以模闆方法模式是基于繼承的一種實作代碼複用的技術。

2、使用委托改寫後:

C#基礎系列——委托和設計模式(二)

優化模闆方法模式的意義:

(1)解除了子類和父類之間的繼承關系,更好地實作了對象間的低耦合。

(2)采用委托可以動态實作方法的組合,這種方式更加靈活,子類可以更加靈活的設計不同部分的方法。然後方法的數量通過params來傳遞,方法的數量沒有什麼嚴格的限制。

當然其他設計模式也可以使用委托去優化設計,部落客在這裡就暫時隻分享這三種模式的異同。總的來說,委托不可能代替多态去實作各種模式,但是它和多态聯合起來使用可以實作更加靈活的設計。通過這兩篇下來,不知道你是否對委托有點感覺了呢,委托這東西,重在實戰,就像遊泳一樣,如果不用那麼幾次,你永遠也不可能學會。以上隻是部落客個人的了解,可能很多友善沒有考慮得那麼全面,希望各位園友拍磚斧正~~

繼續閱讀