推薦閱讀:
自然界有一條規則——適者生存。意思是生物要使用自然界的變化;在程式界中則需要新環境呼叫現存物件。那麼,如何在新環境中呼叫「現存的物件」呢?採用介面卡模式可以解決。介面卡模式使得新環境中不需要去重複實現已經存在了的實現,而很好的把現有的物件(指原來環境中的現有物件)加入到新環境中來使用。
介面卡模式:把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配而無法一起工作的兩個類能夠在一起工作。
介面卡模式要素:
1、抽象目標(target):抽象目標類定義客戶所需的介面,可以是乙個抽象類或介面,也可以是具體類。在類介面卡中,由於c#語言不支援多重繼承,所以它只能是介面;介面卡模式有類的介面卡模式和物件的介面卡模式兩種形式。2、介面卡(adapter)「它可以呼叫另乙個介面,作為乙個轉換器,對adaptee和target進行適配,它是介面卡模式的核心;
3、適配者(adaptee):適配者即被適配的角色,它定義了乙個已經存在的介面,這個介面需要適配,適配者類包好了客戶希望的業務方法。
下面舉兩個例子來帶大家學習介面卡模式。
在生活中,我們買電器的時候買了乙個二孔的插頭,但不幸的是回到家發現家裡只有三孔的插座,這個時候怎麼辦呢?我們希望有個東西能連線電器和插頭。這個東西就是介面卡。命名空間介面卡模式包含classbased和objectbased子命名空間,分別表示基於類的介面卡模式和基於物件的介面卡模式。
類的介面卡中包含家用電器類、電壓類、目標動作介面和手機介面卡類。物件的介面卡中包含適配者、介面卡、目標介面和目標基類。
1.建立電腦icomputer,也就是介面卡模式中的目標角色
public inte***ce ithreehole
2.建立手機,源角色——需要適配的類
public abstract class twohole
}
3.介面卡
/// 介面卡類,介面要放在類的後面
/// 介面卡類提供了三個孔插頭的行為,但其本質是呼叫兩個孔插頭的方法
///
public class poweradapter:twohole,ithreehole
}
4.使用介面卡
static void main(string args)
5.整合後的**:
using system;
/// 這裡以插座和插頭的例子來詮釋介面卡模式
/// 現在我們買的電器插頭是2個孔,但是我們買的插座只有3個孔的
/// 這是我們想把電器插在插座上的話就需要乙個電介面卡
namespace 介面卡模式
}/// /// 三個孔的插頭,也就是介面卡模式中的目標角色
///
public inte***ce ithreehole
/// /// 兩個孔的插頭,源角色——需要適配的類
///
public abstract class twohole
}/// /// 介面卡類,介面要放在類的後面
/// 介面卡類提供了三個孔插頭的行為,但其本質是呼叫兩個孔插頭的方法
///
public class poweradapter:twohole,ithreehole
}}
類的介面卡模式
優點:
可以在不修改原有**的基礎上,很好的符合「開閉原則」
可以重新定義adaptee(被適配的類)的部分行為,因為在類介面卡模式中,adapter是adaptee的子類
僅引入乙個物件,並不需要額外的字段來引用adaptee例項
缺點:
用乙個具體的adapter類對adaptee和target進行匹配,當如果想要匹配乙個類以及所有它的子類時,類的介面卡模式就不能勝任了。因為類的介面卡模式中沒有引入adaptee的例項,光呼叫this.specificrequest方法並不能去呼叫它對應子類的specificrequest方法
採用了 「多繼承」的實現方式,帶來了不良的高耦合。
namespace 物件的介面卡模式
}/// /// 三個孔的插頭,也就是介面卡模式中的目標(target)角色
///
public class threehole
}/// /// 兩個孔的插頭,源角色——需要適配的類
///
public class twohole
}/// /// 介面卡類,這裡介面卡類沒有twohole類,
/// 而是引用了twohole物件,所以是物件的介面卡模式的實現
///
public class poweradapter : threehole
}}
物件的介面卡模式
優點:
可以在不修改原有**的基礎上來復用現有類,很好地符合 「開閉原則」(這點是兩種實現方式都具有的)
採用 「物件組合」的方式,更符合低耦合。
缺點:
使得重定義adaptee的行為較困難,這就需要生成adaptee的子類並且使得adapter引用這個子類而不是引用adaptee本身。
使用場景
在以下情況下可以考慮使用介面卡模式:
系統需要復用現有類,而該類的介面不符合系統的需求
想要建立乙個可重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。
對於物件介面卡模式,在設計裡需要改變多個已有子類的介面,如果使用類的介面卡模式,就要針對每乙個子類做乙個介面卡,而這不太實際。
總結
介面卡可以是抽象類,並介面卡模式的實現是非常靈活的,我們完全可以將adapter模式中的「現存物件」作為新的介面方法引數,介面卡類可以根據引數引數可以返回乙個合適的例項給客戶端。類的介面卡模式是定義乙個介面來實現客戶端想要的方法,並在介面卡類中繼承這個介面和源角色。物件的介面卡模式是在介面卡類中繼承要適配的類並宣告乙個源角色的物件,通過重寫呼叫基類的方法來實現。
23種設計模式05 介面卡模式
目標介面 targetable public inte ce targetable 介面卡,他要具有新的輸出口和舊的輸出口功能,使用繼承 繼承只能是單繼承 實現另乙個介面 public class adapter extends source implements targetable public...
設計模式java 05 介面卡模式
介面卡模式 adapter 就是把乙個類的介面轉換成客戶端所期待的另一種介面。從而使原本兩個因為不匹配的類無法在一起工作變成能在一起工作。舉個栗子來說,現在的家用電器一般都要求使用220v的電壓工作,遇到個別要求使用110v電壓的電器時,我們就需要乙個變壓器,這個變壓器就可以理解成為這裡的介面卡。那...
C 設計模式 介面卡模式
生活中的介面卡 買膝上型電腦,買手機時,都有乙個電源介面卡,電源介面卡又叫外接電源,是小型可攜式電子裝置及電子電器的供電電壓變換裝置,常見於手機,膝上型電腦上。它的作用是將家裡的220v高電壓轉換成這些電子產品能工作的5v 20v左右穩定的低電壓,使它們能正常工作。就是說,如果沒有這個電源介面卡,我...