Adapter模式也叫適配器模式,是由GoF提出的23種設計模式的一種。Adapter模式是構造型模式之一,通過Adapter模式,可以改變已有類(或外部類)的接口形式。
在大規模的系統開發過程中,我們常常碰到諸如以下這些情況:
我
們需要實現某些功能,這些功能已有還不太成熟的一個或多個外部組件,如果我們自己重新開發這些功能會花費大量時間;所以很多情況下會選擇先暫時使用外部組
件,以後再考慮隨時替換。但這樣一來,會帶來一個問題,隨着對外部組件庫的替換,可能需要對引用該外部組件的源代碼進行大面積的修改,因此也極可能引入新
的問題等等。如何最大限度的降低修改面呢?
Adapter模式就是針對這種類似需求而提出來的。
Adapter模式通過定義一個新的接口(對要實現的功能加以抽象),和一個實現該接口的Adapter(適配器)類來透明地調用外部組件。這樣替換外部組件時,最多隻要修改幾個Adapter類就可以了,其他源代碼都不會受到影響。
Adapter模式通過在Adapter類中調用外部組件來實現功能。
根據調用方式的不同,Adapter模式有2種實現方法:
1,通過繼承實現Adapter
2,通過委讓實現Adapter
爲了能更清楚地說明2種實現方法的區別,我們舉例說明:
比如,我們需要實現一個發送郵件的功能,需要用到一個名爲OutMailer的外部組件,因爲上述原因,我們決定用Adapter模式實現對OutMailer的透明調用。
首先,我們把郵件發送的功能抽象成一個接口:
IMailer.java
- interface IMailer {
- //發送郵件
- public void sendMail();
- }
interface IMailer {
//發送郵件
public void sendMail();
}
然後定一個實現IMailer接口的MailerAdapter類。
下面我們來看看MailerAdapter的實現方法。
通過繼承實現Adapter
MailerAdapter.java
- class MailerAdapter extends OutMailer implements IMailer {
- //發送郵件
- public void sendMail() {
- //調用OutMailer.sendMail()方法實現郵件發送
- this .sendMail();
- }
- //這裏省略其他方法
- }
class MailerAdapter extends OutMailer implements IMailer {
//發送郵件
public void sendMail() {
//調用OutMailer.sendMail()方法實現郵件發送
this.sendMail();
}
//這裏省略其他方法
}
通過委讓實現Adapter
MailerAdapter.java
- class MailerAdapter implements IMailer {
- private OutMailer outMailer = new OutMailer();
- //發送郵件
- public void sendMail() {
- //調用OutMailer.sendMail()方法實現郵件發送
- outMailer.sendMail();
- }
- //這裏省略其他方法
- }
class MailerAdapter implements IMailer {
private OutMailer outMailer = new OutMailer();
//發送郵件
public void sendMail() {
//調用OutMailer.sendMail()方法實現郵件發送
outMailer.sendMail();
}
//這裏省略其他方法
}
不管是通過繼承實現Adapter,還是通過委讓實現Adapter,調用方MailerClient的調用方法完全一樣,如下:
MailerClient.java
- IMailer mailer = new MailerAdapter();
- ...
- mailer.sendMail();
IMailer mailer = new MailerAdapter();
...
mailer.sendMail();
我們可以看到,這裏完全沒有直接調用OutMailer,也就是說OutMailer即使被替換了,我們也不用對MailerClient做任何修改。