1、什么是適配器模式?
Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
適配器模式(Adapter Pattern):將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
說人話:這個模式就是用來做適配的,它將不兼容的接口轉(zhuǎn)換為可兼容的接口,讓原本由于接口不兼容而不能一起工作的類可以一起工作。比如現(xiàn)實生活中的例子, USB 轉(zhuǎn)接頭就充當(dāng)適配器,把兩種不兼容的接口,通過轉(zhuǎn)接變得可以一起工作。
2、適配器模式定義
①、Target目標(biāo)角色
該角色定義把其他類轉(zhuǎn)換為何種接口, 也就是我們的期望接口, 例子中的IUserInfo接口就是目標(biāo)角色。
②、Adaptee源角色
你想把誰轉(zhuǎn)換成目標(biāo)角色, 這個“誰”就是源角色, 它是已經(jīng)存在的、 運行良好的類或?qū)ο螅?經(jīng)過適配器角色的包裝, 它會成為一個嶄新、 靚麗的角色。
③、Adapter適配器角色
適配器模式的核心角色, 其他兩個角色都是已經(jīng)存在的角色, 而適配器角色是需要新建立的, 它的職責(zé)非常簡單:把源角色轉(zhuǎn)換為目標(biāo)角色, 怎么轉(zhuǎn)換?通過繼承或是類關(guān)聯(lián)的方式。
3、適配器模式通用代碼實現(xiàn)
/**
* 目標(biāo)角色
*/
public interface Target {
void t1();
void t2();
void t3();
}
/**
* 目標(biāo)角色實現(xiàn)類
*/
public class ConcreteTarget implements Target{
@Override
public void t1() {
System.out.println("目標(biāo)角色 t1 方法");
}
@Override
public void t2() {
System.out.println("目標(biāo)角色 t2 方法");
}
@Override
public void t3() {
System.out.println("目標(biāo)角色 t3 方法");
}
}
/**
* 源角色:要把源角色轉(zhuǎn)換成目標(biāo)角色
*/
public class Adaptee {
public void a1(){
System.out.println("源角色 a1 方法");
}
public void a2(){
System.out.println("源角色 a2 方法");
}
public void a3(){
System.out.println("源角色 a3 方法");
}
}
基于繼承的類適配器
/**
* 適配器角色
*/
public class Adapter extends Adaptee implements Target{
@Override
public void t1() {
super.a1();
}
@Override
public void t2() {
super.a2();
}
@Override
public void t3() {
super.a3();
}
}
基于組合的對象適配器
public class AdapterCompose implements Target{
private Adaptee adaptee;
public AdapterCompose(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void t1() {
adaptee.a1();
}
@Override
public void t2() {
adaptee.a2();
}
@Override
public void t3() {
adaptee.a3();
}
}
測試:
public class AdapterClient {
public static void main(String[] args) {
// 原有的業(yè)務(wù)邏輯
Target target = new ConcreteTarget();
target.t1();
// 基于繼承 增加適配器業(yè)務(wù)邏輯
Target target1 = new Adapter();
target1.t1();
// 基于組合 增加適配器業(yè)務(wù)邏輯
Target target2 = new AdapterCompose(new Adaptee());
target2.t1();
}
}
打印結(jié)果:
適配器模式有兩種實現(xiàn)方式:類適配器和對象適配器。其中,類適配器使用繼承關(guān)系來實現(xiàn),對象適配器使用組合關(guān)系來實現(xiàn)。在實際開發(fā)中,選擇的依據(jù)如下:
①、如果 Adaptee 接口并不多,那兩種實現(xiàn)方式都可以。
②、如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定義大部分都相同,那我們推薦使用類適配器,因為 Adaptor 復(fù)用父類 Adaptee 的接口,比起對象適配器的實現(xiàn)方式,Adaptor 的代碼量要少一些。
③、如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定義大部分都不相同,那我們推薦使用對象適配器,因為組合結(jié)構(gòu)相對于繼承更加靈活。
4、適配器模式優(yōu)點
①、適配器模式可以讓兩個沒有任何關(guān)系的類在一起運行, 只要適配器這個角色能夠搞定他們就成。
②、增加了類的透明性
我們訪問的Target目標(biāo)角色, 但是具體的實現(xiàn)都委托給了源角色, 而這些對高層次模塊是透明的, 也是它不需要關(guān)心的。
③、提高了類的復(fù)用度
源角色在原有的系統(tǒng)中還是可以正常使用, 而在目標(biāo)角色中也可以充當(dāng)新的演員。
④、靈活性非常好
適配器可以隨時去掉,而不會影響很多代碼。
5、適配器模式應(yīng)用場景
①、修改已使用的接口
某個已經(jīng)投產(chǎn)中的接口需要修改,這時候使用適配器最好。
②、統(tǒng)一多個類的接口設(shè)計
比如對于敏感詞過濾,需要調(diào)用好幾個第三方接口,每個接口方法名,方法參數(shù)又不一樣,這時候使用適配器模式,將所有第三方的接口適配為統(tǒng)一的接口定義。
③、兼容老版本接口
比如JDK1.0 中包含一個遍歷集合容器的類 Enumeration,JDK2.0 對這個類進(jìn)行了重構(gòu),將它改名為 Iterator 類,并且對它的代碼實現(xiàn)做了優(yōu)化。但是考慮到如果將 Enumeration 直接從 JDK2.0 中刪除,那使用 JDK1.0 的項目如果切換到 JDK2.0,代碼就會編譯不通過。為了避免這種情況的發(fā)生,我們必須把項目中所有使用到 Enumeration 的地方,都修改為使用 Iterator 才行。
單獨一個項目做 Enumeration 到 Iterator 的替換,勉強(qiáng)還能接受。但是,使用 Java 開發(fā)的項目太多了,一次 JDK 的升級,導(dǎo)致所有的項目不做代碼修改就會編譯報錯,這顯然是不合理的。這就是我們經(jīng)常所說的不兼容升級。為了做到兼容使用低版本 JDK 的老代碼,我們可以暫時保留 Enumeration 類,并將其實現(xiàn)替換為直接調(diào)用 Itertor。
public class Collections {
public static Emueration emumeration(final Collection c) {
return new Enumeration() {
Iterator i = c.iterator();
public boolean hasMoreElments() {
return i.hashNext();
}
public Object nextElement() {
return i.next():
}
}
}
}
④、適配不同格式的數(shù)據(jù)
6、代理-橋接-裝飾器-適配器區(qū)別
①、代理模式在不改變原始類接口的條件下,為原始類定義一個代理類,主要目的是控制訪問,而非加強(qiáng)功能,這是它跟裝飾器模式最大的不同。
②、橋接模式:橋接模式的目的是將接口部分和實現(xiàn)部分分離,從而讓它們可以較為容易、也相對獨立地加以改變。
③、裝飾器模式:裝飾者模式在不改變原始類接口的情況下,對原始類功能進(jìn)行增強(qiáng),并且支持多個裝飾器的嵌套使用。
④、適配器模式:適配器模式是一種事后的補(bǔ)救策略。適配器提供跟原始類不同的接口,而代理模式、裝飾器模式提供的都是跟原始類相同的接口。
-
接口
+關(guān)注
關(guān)注
33文章
8706瀏覽量
151971 -
適配器
+關(guān)注
關(guān)注
8文章
1976瀏覽量
68280 -
代碼
+關(guān)注
關(guān)注
30文章
4830瀏覽量
69091 -
ADAPTOR
+關(guān)注
關(guān)注
0文章
2瀏覽量
5544
發(fā)布評論請先 登錄
相關(guān)推薦
適配器模式和代理模式的區(qū)別
適配器模式實現(xiàn)
引適配器模式的作用
適配器模式相關(guān)資料推薦
缺省適配器模式基本概念
什么是硬件適配器模式
適配器模式的本質(zhì)及分類
適配器模式和代理模式的區(qū)別
![<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>和代理<b class='flag-5'>模式</b>的區(qū)別](https://file1.elecfans.com//web2/M00/A7/27/wKgZomUMQrWAd34jAAAvQ2bAN0k459.png)
適配器模式的應(yīng)用
![<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>的應(yīng)用](https://file1.elecfans.com//web2/M00/A7/28/wKgZomUMQraAMPb5AAAh2tOXPaM142.png)
JavaScript設(shè)計模式之適配器模式
![JavaScript設(shè)計<b class='flag-5'>模式</b>之<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
設(shè)計模式-適配器模式-以電壓適配器為例
![設(shè)計<b class='flag-5'>模式</b>-<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>-以電壓<b class='flag-5'>適配器</b>為例](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
適配器模式設(shè)計
![<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>設(shè)計](https://file1.elecfans.com/web2/M00/89/11/wKgaomR4OPCAP-3ZAACV7K_Lv8A454.jpg)
評論