面試中無數次被問及到什麼是接口,什麼是抽象類,接口和抽象類有什麼區別?什麼是委託,什麼是事件。面試
請寫出貓叫了,老鼠跑了的例子。。。。。算法
這些東西對於一些初學者來講可能還真的有點搞不懂,對於通常工做5,6年以上的人來講,實在不屑一提,編程
類:對事物或者某一個物體的歸納描述瀏覽器
抽象類:對於一類事物的高度抽象。能夠實現任何接口函數
接口:對方法的一組抽象提取。工具
事件:暴露給關聯類的自定義實現,用於解除兩個類之間的耦合。blog
在基於模板Template模式中,也是咱們會無心中就會使用到的方法。將一些不變的公共的部分,提取出來方法父類當中,而對於每個獨立變化的點,咱們將接口
他們封裝爲抽象方法。事件
對於上述的一個模板,咱們標記爲紅色的方法,打印結果,它有可能在控制檯打印輸出,或者放在瀏覽器中顯示等等。對於這個點,它是可變的,也就是咱們所說的get
它是抽象的。
在策略Strategy模式當中,咱們瞭解到它是對抽象的策略算法的調用。例如,超市裏面計算商品的結果。
可能部分商品打3,5折,也有可能不打折,或者還有不少種可能,而咱們最終要獲得商品的總價格。對於上述的策略,咱們認爲它是可變的,是抽象的。
經典的策略模式代碼可能以下:
對於不一樣的策略方法,咱們只要再實現對應不一樣的IAction便可。
在C#中,咱們知道有個AOP的概念,俗稱面向切面編程。若是咱們不經過自定義的特性Attribute,或者第三方AOP方法攔截去實現,有沒有辦法實現呢。
如下是我在項目中常常使用到的方法,懶人就是懶啊。
我我的將它理解爲解除兩個類之間的耦合的最佳工具。仍是用貓叫了,老鼠跑了來演示下。
在經典的觀察者模式當中,或許也會存在一些耦合,仔細觀察上述代碼,兩個類之間的沒有任何一方類的調用,咱們稱它們沒有任何的耦合。
那麼如何能讓她們相互通知,那就是依賴於咱們的事件。
代碼雖然很簡單,可是項目當中,大夥歷來不知道如何妙用它。最近的項目看見同事常常在父窗體調用子窗體,而後子窗體須要刷新父窗體的控件的時候。
直接在子窗體中將父窗體放入子窗體的構造函數中,直接產生了依賴。若是能在子窗體中聲明一個事件,將它理解爲要發送的消息。父窗體來實現這個接受消息的函數,是否是更加優雅點呢。