java適配器模式--可能是你經常用的模式

  在本博客之前的設計模式中,已經把創建型模式的講完了。這篇文章,我們來開始接觸結構型模式,結構型模式有7種之多,不過博主我會陪你一個一個來探討,逐個擊破。

  首先適配器模式的作用在於串聯不同類的方法和功能。起到一個轉換,和匹配的作用。就好像我們常見的港版iPhone手機的充電器需要的轉接頭一樣。

  適配器模式分爲三種模式,類的適配器模式、對象的適配器模式、接口的適配器模式。這3種模式實現的方式各有不同,我們先來看看類的適配器模式吧。上代碼:

/**
 * 插座類
 * 方法就是可以給使用的設備充電
 */
public class Plug {
    public void charging(){
        System.out.println("充電");
    }
}

  我們先創建一個插座類,類裏面加上充電的方法。

/**
 * 表示充電過程的接口
 *
 */
public interface IPlugAction {
    /**
     * 充電動作
     */
    public void charging();
    /**
     * 充電條件
     * 把充電器插到插座上
     */
    public void putChargerToPlug();
}

  然後這是一個充電過程的接口。包含了之前插座類的充電的方法。

  

/**
 * 繼承了Plug類和實現了IPlugAction接口的充電類
 */
public class GetCharge extends Plug implements IPlugAction {
    @Override
    public void putChargerToPlug() {
        System.out.println("把充電器插到插座上");
    }
} 
public class ChargeTest {
    public static void main(String[] args) {
        GetCharge getCharge = new GetCharge();
        getCharge.charging();
        getCharge.putChargerToPlug();
    }
}

   接着,我們創建這個類的適配器中最重要的類,GetCharge。這個類繼承了Plug類和實現了充電過程的接口。最後,我們就可以發現GetCharge類通過繼承類的方式來省去了其中一個方法的重寫,達到了自己的充電過程。這種方式就叫做類的適配器模式。在後面的輸出中,我們就可以看到完整的充電過程。

"C:\Program Files\Java\jdk1.8.0_60\bin\java"...
把充電器插到插座上
充電
Process finished with exit code 0

  那對象的適配器模式是和類的適配器模式差不多嗎?答案是Yes!類的適配器是通過繼承類的方式,而對象的適配器則是通過實例化一個對象來達到目的。所以我們只修改了GetCharge類,就完成了對象的適配器模式了。我們看看修改過後的GetCharge類吧

/**
 * 繼承了Plug類和實現了IPlugAction接口的充電類
 */
public class GetCharge implements  IPlugAction {
    private Plug plug;

    public GetCharge(Plug plug) {
        this.plug = plug;
    }

    @Override
    public void putChargerToPlug() {
        System.out.println("把充電器插到插座上");
    }

    @Override
    public void charging() {
        plug.charging();
    }
}

  其實這也是一種變通的方法來實現充電過程了。沒什麼好深究的了。那最後的接口的適配器模式又是怎麼樣的呢?

  接口的適配器模式其實是使用了抽象類作爲承接的方式。我們都知道抽象類實現接口的時候可以不實例化。而我們之前的做法也是想着不實現接口裏面的所有方法。那就簡單了,我們先讓抽象類去實現這個充電過程的接口,然後我們再繼承這個抽象類,這樣我們再在繼承了抽象類的GetCharge類裏面實現一個充電的方法就好了。這種場景也經常發生在我們項目中,當你想要實現一個接口,但是又不想將這個接口中所有的方法都實現的情況。這時候,就可以使用接口的適配器模式,也就是弄一個抽象類來解決咯。

public abstract class AbstractCharge implements IPlugAction{

    public void charging(){}

    public void putChargerToPlug(){}
}

 創建一個抽象類來實現IPlugAction接口。

public class Charge1 extends AbstractCharge {
    public void charging(){
        System.out.println("充電1");
    }
}
public class Charge2 extends AbstractCharge {
    public void putChargerToPlug(){
        System.out.println("把充電器插到插座上");
    }
}

  再來2個類繼承抽象類。

  

public class ChargeTest {
    public static void main(String[] args) {
        Charge1 charge1 = new Charge1();
        Charge2 charge2 = new Charge2();
        System.out.println(1);
        charge1.charging();
        System.out.println(2);
        charge1.putChargerToPlug();
        System.out.println(3);
        charge2.charging();
        System.out.println(4);
        charge2.putChargerToPlug();
    }
}
1
充電1
2
3
4
把充電器插到插座上
  在測試方法中,我們可以看到,繼承了抽象類的子類Charge1調用的charging方法是自己重寫後的。沒有重寫的方法調用的是抽象類的,自然就沒有打印結果了。

  這就是java的適配器模式了,不復雜。學習了以後,細心看看自己的項目吧,沒準也有用到的地方呢。

照舊分享一首歌的歌詞


Cause baby life is tired when you're on the road.

There's lots of pretty faces that I don't know.

I could hava a million people at my show .

I'd rather come home

                                                                                                                                                         --Home

   

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