在軟體開發的世界裡,許多領域中的問題具有相似的特性。就像造房子一樣,不管要蓋一座購物中心,還是要蓋一座假日酒店,它們之間都有基本上相似的工作步驟,都需要搭建梁柱,鋪置房頂等工作。在做這些工作時都需要遵循某種特殊的技術要求,以使得房子的結構、承受能力達到合理,這些規則是前人經過精確的計算和失敗的教訓得來的。對於軟體開發也一樣,如果我們希望編寫出來健壯、靈活的應用程式,也有必要進行精細的設計,並且可以通過遵循某種規則以達到這個目標。這些規則或者稱之為技巧就是設計模式。
設計模式領域中有一本經典的著作:《design patterns: elements of reusable object-oriented software》(即《設計模式》一書),由 erich gamma、richard helm、ralph johnson 和 john vlissides 合著(addison-wesley,1995)。這幾位作者常被稱為「四人組(gang of four)」,而這本書也就被稱為「四人組(或 gof)」書。此書中介紹了23種設計模式,隨著技術的不斷發展,新的設計模式不斷的被發現,但這23種設計模式是最值得學習和掌握的。 c#設計模式中將設計模式劃分為以下5類:
各類別中包含的模式:
類別包含的設計模式
介面型介面卡模式,外觀模式,合成模式,橋接模式
職責型單件模式,觀察者模式,中介者模式,**模式,職責鏈模式,享元模式
構造型生成器模式,工廠方式模式,抽象工廠模式,原型模式,備忘錄模式
操作型模板方法模式,狀態模式,策略模式,命令模式,直譯器模式
擴充套件型裝飾模式,迭代器模式,訪問者模式
在進行專案開發時,經常會發生類之間的呼叫關第,有可能存在以下兩種情況:
1. 我們已經定義了類呼叫關係,例如類需要通過呼叫實現了某個介面的類來實現特定功能,而這個功能第三方類已經實現了,第三方類的方法簽名可能與客戶期望的簽名不太一致。
2.這些類提供的方法可能只是完成了我們所需要的大部分功能,我們還要在此基礎上執行一點點額外的操作;
以上兩種問題實際上都是客戶需要對提供功能的服務類的呼叫,可以有以下幾種解決方案:
1. 直接在客戶類裡例項化服務類,進行方法呼叫,並且根據需要在呼叫後進行額外的處理。
2. 建立乙個中介,將方法呼叫傳遞給中介,由中介請求服務類並執行額外操作。
比較而言,第二種方式更為合理,因為通過中介類的引處,降低了客戶類和服務類的耦合,在服務類發生變化時,可以不影響到客戶類。
對於這種問題,可以使用介面卡模式。介面卡模式的目的在於:如果客戶需要使用某個類的服務,而這項服務是這個類用乙個不同的介面提供的,那麼,可以使用介面卡為客戶提供乙個期望的介面。
存在兩種介面卡的形式:介面介面卡(類介面卡)和物件介面卡。
1. 介面介面卡
客戶類需要通過對某個介面的呼叫來實現某個功能,而這個功能已經被服務類實現了。可以引入介面卡類,該類繼承自服務類並實現了客戶端要呼叫的介面。
例如現在期望實現使用者登入的同時更新最後活動時間的功能,約定客戶類需要呼叫某個介面的方法實現該操作。此時發現已有現成的類(服務類)實現了使用者登入的功能,但沒有實現更新活動時間的操作,因此可以建立乙個介面介面卡。類關係圖如下所示:
客戶類**如下(只定義了相應的方法,未編寫實現):
/// ///介面定義如下:客戶類///
class
client
set}
/// ///
使用者登入
///
///
使用者名稱
///
最後活動日期
public void login(string user, datetime lastactivitydate)
}
inte***ce服務類定義如下:iuser
/// ///介面介面卡定義如下:服務類///
class
service
}
class此時可以直接例項化client類並完成登入呼叫,例如:inte***ceadapter : service, iuser
private void updateactivitydate(string name, datetime lastactivitydate)
}
client client = new以上是介面介面卡的示例,如果客戶端不存在這樣的乙個介面,那麼可以使用物件介面卡。client();
client.login("admin",datetime.now);
2. 物件介面卡
使用物件介面卡時,需要建立客戶類的乙個子類,並重寫相應的方法,在該介面卡類中通過服務類完成相應的功能並執行其他操作,在執行客戶類操作時可以通過介面卡完成。但是需要注意把客戶端相應的方法定義為virtual以能夠重寫。上述示例使用物件介面卡的類關係圖如下所示:
objectadapter定義如下:
class在執行使用者登入時可以通過objectadapter完成,例如:objectadapter:client
public override void login(string user, datetime lastactivitydate)
private void updateactivitydate(string name, datetime lastactivitydate)
}
client client = new和介面介面卡相比,物件介面卡更加脆弱,這主要是由於物件介面卡沒有引入介面,在服務類發生變化時,仍然需要修改客戶端**。objectadapter();
client.login("admin",datetime.now);
設計模式之介面卡模式(類介面卡模式)
介面卡模式,即定義乙個包裝類,用於包裝不相容介面的物件 包裝類 介面卡adapter 被包裝物件 適配者adaptee 被適配的類 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。介面卡模式的形式分為 類的介面卡模式和物件的介面卡模式 模式原理...
設計模式之 介面卡模式
1,介面卡模式把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法一起工作的兩個類能夠在一起工作 2,介面卡模式有兩種 1 類的介面卡模式 介面卡類繼承源類 這樣介面卡類就繼承了源類有的方法 並實現目標介面,實現在源類中沒有而在介面中有的方法,從而實現介面卡類有目標介面的所有方...
設計模式之介面卡模式
介面卡模式定義 將乙個類的介面,轉換成客戶期望的另乙個介面。介面卡讓原本介面不相容的類可以合作無間。簡單定義 封裝物件,並提供不同的介面。簡單例子 鴨子介面 package headfirst.adapter.ducks public inte ce duck 具體鴨子 package headfi...