定義
將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口站故,使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結(jié)構(gòu)型模式磷杏,也可以作為對(duì)象結(jié)構(gòu)型模式。
注:在適配器模式定義中所提及的接口是指廣義的接口捏卓,它可以表示一個(gè)方法或者方法的集合极祸。根據(jù)適配器類與適配者類的關(guān)系不同慈格,適配器模式可分為對(duì)象 適配器和類適配器兩種,在對(duì)象適配器模式中遥金,適配器與適配者之間是關(guān)聯(lián)關(guān)系;在類適配 器模式中浴捆,適配器與適配者之間是繼承(或?qū)崿F(xiàn))關(guān)系。
對(duì)象適配器
本質(zhì)
將適配者應(yīng)用到目標(biāo)類上稿械,使得目標(biāo)類具有適配者的功能选泻。適配器和適配者是關(guān)聯(lián)關(guān)系
UML類圖
角色和職能
Target(目標(biāo)抽象類):定義客戶所需接口,可以是一個(gè)抽象類或接口美莫,也可以是具體類页眯。
Adapter(適配器類):可以調(diào)用另一個(gè)接口,作為一個(gè)轉(zhuǎn)換器厢呵,對(duì)Adaptee和Target進(jìn)行適配窝撵,適配器類是適配器模式的核心,通過集成Target并關(guān)聯(lián)一個(gè)Adaptee對(duì)象使二者關(guān)聯(lián)起來襟铭。
Adaptee(適配者類):適配者即被適配的角色碌奉,它定義了一個(gè)已經(jīng)存在的接口,這個(gè)接口 需要適配寒砖,適配者類一般是一個(gè)具體類道批,包含了客戶希望使用的業(yè)務(wù)方法,在某些情況下可 能沒有適配者類的源代碼入撒。
類適配器
本質(zhì)
將適配者應(yīng)用到目標(biāo)類上,使得目標(biāo)類具有適配者的功能椭岩。適配器和適配者是繼承關(guān)系
UML類圖
角色和職能
同上
JDK中的使用
InputStreamReader
該類繼承自Reader類茅逮,并關(guān)聯(lián)StreamDecoder類。所表達(dá)的含義是:通過適配者StreamDecoder類提供的功能判哥,來適配目標(biāo)類Reader中不存在的功能献雅。并提供新類InputStreamReader提供服務(wù)。
使用場(chǎng)景
- 系統(tǒng)需要使用一些現(xiàn)有的類塌计,而這些類的接口(如方法名)不符合系統(tǒng)的需要挺身,甚至沒有這些類的源代碼。
- 想創(chuàng)建一個(gè)可以重復(fù)使用的類锌仅,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類章钾,包括一些可能在將來引進(jìn)的類一起工作。
練習(xí)
Sunny軟件公司OA系統(tǒng)需要提供一個(gè)加密模塊热芹,將用戶機(jī)密信息(如口令贱傀、郵箱等)加 密之后再存儲(chǔ)在數(shù)據(jù)庫中,系統(tǒng)已經(jīng)定義好了數(shù)據(jù)庫操作類伊脓。為了提高開發(fā)效率府寒,現(xiàn)需 要重用已有的加密算法,這些算法封裝在一些由第三方提供的類中,有些甚至沒有源代 碼株搔。試使用適配器模式設(shè)計(jì)該加密模塊剖淀,實(shí)現(xiàn)在不修改現(xiàn)有類的基礎(chǔ)上重用第三方加密 方法。
目標(biāo)類
public class TargetDao {
protected void add(String user,String password){
}
protected void delete(String user){
}
protected void update(String user,String password){
}
protected String get(String user){
return "";
}
}
適配者類
public class EncoderAdaptee {
public String encode(String content){
return "加密后的信息";
}
}
適配器類
public class DaoEncoderAdapter extends TargetDao{
private EncoderAdaptee encoder;
@Override
protected void add(String user, String password) {
password = encoder.encode(password);
super.add(user, password);
}
@Override
protected void update(String user, String password) {
password = encoder.encode(password);
super.update(user, password);
}
}