設計模式之適配器-Adapter--適配器模式

Adapter模式也叫適配器模式,是由GoF提出的23種設計模式的一種。Adapter模式是構造型模式之一,通過Adapter模式,可以改變已有類(或外部類)的接口形式。

Adapter模式的概念

在大規模的系統開發過程中,我們常常碰到諸如以下這些情況:
我 們需要實現某些功能,這些功能已有還不太成熟的一個或多個外部組件,如果我們自己重新開發這些功能會花費大量時間;所以很多情況下會選擇先暫時使用外部組 件,以後再考慮隨時替換。但這樣一來,會帶來一個問題,隨着對外部組件庫的替換,可能需要對引用該外部組件的源代碼進行大面積的修改,因此也極可能引入新 的問題等等。如何最大限度的降低修改面呢?
Adapter模式就是針對這種類似需求而提出來的。

Adapter模式通過定義一個新的接口(對要實現的功能加以抽象),和一個實現該接口的Adapter(適配器)類來透明地調用外部組件。這樣替換外部組件時,最多隻要修改幾個Adapter類就可以了,其他源代碼都不會受到影響。

實現Adapter模式的2種方法與範例

Adapter模式通過在Adapter類中調用外部組件來實現功能。
根據調用方式的不同,Adapter模式有2種實現方法:
1,通過繼承實現Adapter

2,通過委讓實現Adapter


爲了能更清楚地說明2種實現方法的區別,我們舉例說明:
比如,我們需要實現一個發送郵件的功能,需要用到一個名爲OutMailer的外部組件,因爲上述原因,我們決定用Adapter模式實現對OutMailer的透明調用。
首先,我們把郵件發送的功能抽象成一個接口:
IMailer.java

  1. interface  IMailer {  
  2.     //發送郵件   
  3.     public   void  sendMail();  
  4. }  
interface IMailer {
    //發送郵件
    public void sendMail();
}



然後定一個實現IMailer接口的MailerAdapter類。

下面我們來看看MailerAdapter的實現方法。

通過繼承實現Adapter
MailerAdapter.java

  1. class  MailerAdapter  extends  OutMailer  implements  IMailer {  
  2.     //發送郵件   
  3.     public   void  sendMail() {  
  4.         //調用OutMailer.sendMail()方法實現郵件發送   
  5.         this .sendMail();  
  6.     }  
  7.   
  8.     //這裏省略其他方法   
  9. }  
class MailerAdapter extends OutMailer implements IMailer {
    //發送郵件
    public void sendMail() {
        //調用OutMailer.sendMail()方法實現郵件發送
        this.sendMail();
    }

    //這裏省略其他方法
}



通過委讓實現Adapter
MailerAdapter.java

  1. class  MailerAdapter  implements  IMailer {  
  2.     private  OutMailer outMailer =  new  OutMailer();  
  3.     //發送郵件   
  4.     public   void  sendMail() {  
  5.         //調用OutMailer.sendMail()方法實現郵件發送   
  6.         outMailer.sendMail();  
  7.     }  
  8.   
  9.     //這裏省略其他方法   
  10. }  
class MailerAdapter implements IMailer {
    private OutMailer outMailer = new OutMailer();
    //發送郵件
    public void sendMail() {
        //調用OutMailer.sendMail()方法實現郵件發送
        outMailer.sendMail();
    }

    //這裏省略其他方法
}




不管是通過繼承實現Adapter,還是通過委讓實現Adapter,調用方MailerClient的調用方法完全一樣,如下:
MailerClient.java

  1. IMailer mailer =  new  MailerAdapter();  
  2. ...  
  3. mailer.sendMail();  
IMailer mailer = new MailerAdapter();
...
mailer.sendMail();



我們可以看到,這裏完全沒有直接調用OutMailer,也就是說OutMailer即使被替換了,我們也不用對MailerClient做任何修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章