1. 程式人生 > >面向物件設計模式之---介面卡模式(Adapter Pattern)

面向物件設計模式之---介面卡模式(Adapter Pattern)

今天要介紹的模式是介面卡模式,說起介面卡,我想大家可能會很容易想到各種電源介面卡。舉一個比較形象的例子吧,比如蘋果早期的充電器。

蘋果做了一個很人性化的設計,它的充電頭是可以換

也就是說,假如我出國旅行,各國的標準電壓是不同的,我不用更換充電器,只需要更換一個頭就可以了。

上面可能有點扯遠了啊!不過這個跟我們今天要談的介面卡模式息息相關。還是上面的場景,如果我不更換頭,那我的電子裝置是不是離開了China就不能使用了呢?其實,如果從介面卡模式的設計角度看,蘋果的充電器有兩個介面卡:

  • 可更換的頭:適配各個國家不同的電壓
  • 充電器本身:將各個不同的電壓轉換成裝置可以接受的電壓範圍。

顯然,介面卡的核心在於轉換。在開發中,如果一個較新的系統要複用較老系統的某一個功能,但是由於各種原因導致二者無法自然銜接。此時,就應該考慮介面卡模式,通過介面卡將二者融合。

介面卡模式的定義為:

介面卡模式,將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。——《大話設計模式》

其UML類圖為:

圖中這個Target是開發者所期待的介面,Adaptee是要準備複用的類。而介面卡Adapter類通過在內部包裝一個Adaptee物件,把源介面轉換成目標介面。

將上面充電的例子轉化成程式碼如下:

import java.util.*;
//電力類
abstract class Electricity
{
  //輸送電
  public abstract double transmit();
}

//中國的電力
class ChinaElectricity extends Electricity
{
  //中國標準電壓
    private float power = 220;
   public double transmit(){return this.power;};
}

//日本的電力
class JapanElectricity extends Electricity
{
    //日本標準電壓
private float power = 110; public double transmit(){return this.power;}; } //裝置類 class Device { private Adapter ad = new Adapter();//電源介面卡 private double power = 5;//裝置能接受的電壓 //充電方法,在哪裡充電 public void charge(String where) { ad.changeToDevicePower(where,power); System.out.println("正在充電..."); } } //電源介面卡類 class Adapter { private ChinaElectricity ce = new ChinaElectricity(); private JapanElectricity je = new JapanElectricity(); //轉換電流 public void changeToDevicePower(String where,double devicePowe) { double power = 0; if(where.equals("China")) { power = ce.transmit(); } else if(where.equals("Japan")) { power = je.transmit(); } System.out.println("將"+power+"V轉換為裝置可用電壓"+devicePowe+"V"); } } public class Main { public static void main(String[] args) { Device d = new Device(); d.charge("China"); d.charge("Japan"); } }

上述程式碼的UML圖

執行效果如下:

上述充電器圖片來自百度圖片搜尋。如果有錯誤的話還希望能在評論中指出,共同進步^_^