Java最優(yōu)良的Adapter模式:適配器模式
網(wǎng)上關(guān)于JAVA的適配器模式例子有很多,但真的有少實在不怎么樣,看也不懂。自己總結(jié)了一個在性能和結(jié)構(gòu)上都很容易理解的Adapter模式。
Adapter模式也叫適配器模式,是由GoF提出的23種設(shè)計模式的一種。Adapter模式是構(gòu)造型模式之一,通過Adapter模式,可以改變已有類(或外部類)的接口形式。
在大規(guī)模的系統(tǒng)開發(fā)過程中,我們常常碰到諸如以下這些情況:
我們需要實現(xiàn)某些功能,這些功能已有還不太成熟的一個或多個外部組件,如果我們自己重新開發(fā)這些功能會花費大量時間;所以很多情況下會選擇先暫時使用外部組件,以后再考慮隨時替換。但這樣一來,會帶來一個問題,隨著對外部組件庫的替換,可能需要對引用該外部組件的源代碼進行大面積的修改,因此也極可能引入新的問題等等。如何最大限度的降低修改面呢?
Adapter模式就是針對這種類似需求而提出來的。
Adapter模式通過定義一個新的接口(對要實現(xiàn)的功能加以抽象),和一個實現(xiàn)該接口的Adapter(適配器)類來透明地調(diào)用外部組件。這樣替換外部組件時,最多只要修改幾個Adapter類就可以了,其他源代碼都不會受到影響。
實現(xiàn)Adapter模式的2種方法與范例
Adapter模式通過在Adapter類中調(diào)用外部組件來實現(xiàn)功能。
根據(jù)調(diào)用方式的不同,Adapter模式有2種實現(xiàn)方法:
- 通過繼承實現(xiàn)Adapter
- 通過委讓實現(xiàn)Adapter
為了能更清楚地說明2種實現(xiàn)方法的區(qū)別,我們舉例說明:
比如,我們需要實現(xiàn)一個發(fā)送郵件的功能,需要用到一個名為OutMailer的外部組件,因為上述原因,我們決定用Adapter模式實現(xiàn)對OutMailer的透明調(diào)用。
首先,我們把郵件發(fā)送的功能抽象成一個接口:
- IMailer.java
- interface IMailer {
- //發(fā)送郵件
- publicvoid sendMail();
- }
然后定一個實現(xiàn)IMailer接口的MailerAdapter類。
下面我們來看看MailerAdapter的實現(xiàn)方法。
通過繼承實現(xiàn)Adapter
MailerAdapter.java
- class MailerAdapter extends OutMailerimplements IMailer {
- //發(fā)送郵件
- publicvoid sendMail() {
- //調(diào)用OutMailer.sendMail()方法實現(xiàn)郵件發(fā)送
- this.sendMail();
- }
- //這里省略其他方法
- }
通過委讓實現(xiàn)Adapter
MailerAdapter.java
- class MailerAdapter implements IMailer {
- private OutMailer outMailer =new OutMailer();
- //發(fā)送郵件
- publicvoid sendMail() {
- //調(diào)用OutMailer.sendMail()方法實現(xiàn)郵件發(fā)送
- outMailer.sendMail();
- }
- //這里省略其他方法
- }
不管是通過繼承實現(xiàn)Adapter,還是通過委讓實現(xiàn)Adapter,調(diào)用方MailerClient的調(diào)用方法完全一樣,如下:
MailerClient.java
- IMailer mailer =new MailerAdapter();
- ...
- mailer.sendMail();
我們可以看到,這里完全沒有直接調(diào)用OutMailer,也就是說OutMailer即使被替換了,我們也不用對MailerClient做任何修改。
原文鏈接:http://blog.csdn.net/hjm4702192/article/details/7821325