1. 適配器模式
適配器模式(Adapter Pattern)是結(jié)構(gòu)性設(shè)計(jì)模式瞬矩,其目的是協(xié)調(diào)不兼容的結(jié)構(gòu),把一個(gè)類(lèi)的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類(lèi)能夠在一起工作。
適配器模式包括了類(lèi)的適配器模式和對(duì)象的適配器模式相速,尤其是對(duì)象的適配器模式,它是其它結(jié)構(gòu)性設(shè)計(jì)模式的起源鲜锚。結(jié)構(gòu)性設(shè)計(jì)模式一共7種突诬,分別是適配器模式、裝飾器模式芜繁、代理模式旺隙、外觀模式、橋接模式骏令、組合模式蔬捷、享元模式。
適配器模式的角色一共有三種榔袋。
Target(目標(biāo)類(lèi)): 客戶端需要的接口周拐,可以是一個(gè)抽象類(lèi)或接口,也可以是具體類(lèi)凰兑。
Adaptee(適配者類(lèi)): 被適配的角色妥粟,由于不是客戶端期待的接口,需要被適配吏够。
Adapter(適配器類(lèi)): 適配器把源接口轉(zhuǎn)換成目標(biāo)接口勾给,對(duì)Target和Adaptee進(jìn)行適配,是適配器模式的核心锅知。
2. 構(gòu)建者模式舉例
2.1 類(lèi)的適配器模式
類(lèi)適配器模式中適配器和適配者是繼承關(guān)系播急。
當(dāng)希望將一個(gè)類(lèi)轉(zhuǎn)換成滿足另一個(gè)新接口的類(lèi)時(shí),可以使用類(lèi)的適配器模式喉镰,創(chuàng)建一個(gè)新類(lèi)旅择,繼承原有的類(lèi)惭笑,實(shí)現(xiàn)新的接口即可侣姆。
類(lèi)的適配器模式中,只能適配一種適配者(Adaptee)沉噩,因?yàn)橹荒躩ava只允許繼承一個(gè)類(lèi)捺宗。
序號(hào) | 類(lèi)名 | 角色 | 說(shuō)明 |
---|---|---|---|
1 | Target | Target | 目標(biāo)類(lèi) |
2 | Adaptee | Adaptee | 適配者類(lèi),被適配的角色 |
3 | Adapter | Adapter | 適配器類(lèi) |
4 | Client | 客戶端 | 演示調(diào)用 |
1. Target 目標(biāo)類(lèi)
/**
* 目標(biāo)類(lèi)川蒙,定義客戶需要的接口蚜厉。
*/
public interface Target {
// 連接USB接口
public void ConnectUsb();
// 給手機(jī)充電
public void chargePhone();
}
2. Adaptee 適配者類(lèi),源類(lèi)
/**
* 適配者類(lèi)畜眨,被適配的角色昼牛。
*/
public class Adaptee {
public void charge(){
System.out.println("接通 220V 電源");
}
}
3. Adapter 適配器
/**
* 適配器類(lèi)术瓮,是適配器模式的核心,對(duì)Adaptee和Target進(jìn)行適配贰健。
* <p>
* 類(lèi)的適配器模式中胞四,只能適配一種適配者(Adaptee),因?yàn)橹荒躩ava只允許繼承一個(gè)類(lèi)伶椿。
*/
public class Adapter extends Adaptee implements Target {
@Override
public void ConnectUsb() {
System.out.println("連接USB");
}
// 把220V的電源適配成5V的辜伟。
@Override
public void chargePhone() {
charge();
System.out.println("接通 5V 的電源");
}
}
4. Client 客戶端
/**
* 客戶端需要的是5V的電源,Adaptee提供的是220V的電源脊另,因此需要適配导狡。
*/
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
target.ConnectUsb(); // 連接USB
target.chargePhone(); // 充電
}
}
2.2 對(duì)象的適配器模式
對(duì)象的適配器模式,和上面的類(lèi)的適配器模式的不同點(diǎn)在于適配器類(lèi)偎痛,對(duì)象適配器模式中適配器和適配者之間是關(guān)聯(lián)關(guān)系旱捧。
當(dāng)希望將一個(gè)對(duì)象轉(zhuǎn)換成滿足另一個(gè)新接口的對(duì)象時(shí),可以創(chuàng)建一個(gè)Adapter(或者叫Wrapper)類(lèi)看彼,持有原類(lèi)的一個(gè)實(shí)例廊佩,在Adapter類(lèi)的方法中,調(diào)用實(shí)例的方法靖榕。
/**
* 適配器類(lèi)标锄,是適配器模式的核心,對(duì)Adaptee和Target進(jìn)行適配茁计。
* <p>
* 本例是對(duì)象的適配器模式料皇,即Adapter持有Adaptee實(shí)例,而不是繼承星压。
* 這樣依賴適配器就可以適配更多的Adaptee践剂。
*/
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void ConnectUsb() {
System.out.println("連接USB");
}
// 把220V的電源適配成5V的。
@Override
public void chargePhone() {
adaptee.charge();
System.out.println("接通 5V 的電源");
}
}
3. 適配器模式總結(jié)
適配器模式是結(jié)構(gòu)性設(shè)計(jì)模式娜膘,通過(guò)適配器類(lèi)(Adapter)逊脯,形成了更大的類(lèi)的結(jié)構(gòu)。
優(yōu)點(diǎn):
將目標(biāo)類(lèi)(Target)和適配者(Adaptee)解耦竣贪,具有良好的靈活性和擴(kuò)展性军洼,客戶端對(duì)此毫無(wú)所知。
缺點(diǎn):
類(lèi)適配器模式只能適配一個(gè)Adaptee演怎,因?yàn)閖ava不允許多繼承匕争,而且Adaptee類(lèi)不能是final的。
(完)