經常使用設計模式:適配器模式

  相信適配器這個概念對於大夥來講都不陌生了吧?曾經買過港貨的經過都知道,港貨當中的充電器插線頭是很蛋疼的三插口的,可是咱們日常的充電插座,通常都是兩插口的,那麼要解決這個問題,咱們的適配器就登場了,可以完美的將三插口轉換成兩插口的接口,而後咱們就能在咱們的兩插口插排上使用充電器啦,姑且上個圖吧~(該篇隨記是參考了:http://blog.csdn.net/jason0539/article/details/22468457)java

  瞭解了什麼是適配器,那麼適配器模式就一目瞭然了,適配器模式就是將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。如下是適配器模式的具體的角色:ide

1.目標接口(Target):客戶所期待的接口。目標能夠是具體的或抽象的類,也能夠是接口。函數

2.須要適配的類(Adaptee):須要適配的類或適配者類。學習

3.適配器(Adapter):經過包裝一個須要適配的對象,把原接口轉換成目標接口。this

二話不說,先上個代碼過過癮:spa

public interface Target {

    void twoInsert();
    
}

//普通的實現了目標接口的類
public class ConcreteTarget implements Target {
    @Override
    public void twoInsert() 
    {
          System.out.println("這個插頭有兩個插口");  
    }
}

這是咱們的目標接口和實現了目標接口的普通類。.net

//特殊的類,也就是咱們例子當中的三插口的插頭

public class ThreeInsertSocket 
{
    public void ThreeInsert() 
    {  
        System.out.println("這個插頭有三個插口");  
    }      
}

這是咱們的特殊類,接下來咱們看看如何經過咱們的適配器實現目標接口的twoInsert方法和ThreeInsert方法的適配,見證奇蹟的時刻:code

public class Adapter extends ThreeInsertSocket implements Target{
    @Override
    public void twoInsert() 
    {
        super.ThreeInsert();
    }

}

其實就是很簡單的辦法,首先經過適配器(adapter)去繼承ThreeInsertSocket,把特殊的方法繼承下來,而後再用適配器(adapter)去實現目標接口,經過重寫目標接口的方法,在該方法當中調用繼承下來的特殊方法便可,是否是很簡單?對象

public class test 
{
    public static void main(String[] args)
    {
        //正常實現了目標接口的普通功能類
        Target concreteTarget = new ConcreteTarget();  
        concreteTarget.twoInsert();  
          
        // 使用特殊功能類,即適配類  
        Target adapter = new Adapter();  
        adapter.twoInsert();

    }
}
這個插頭有兩個插口
這個插頭有三個插口

這就是運行的結果。那麼整體過程能夠總結爲如下的圖:blog

圖中的Adaptee對應的就是咱們的ThreeInsertSocket,這就是適配器模式當中的類適配器的寫法,類適配器是經過適配器類(adapter)繼承所須要適配的對象(adaptee),而且再實現目標接口(target)來實現被適配對象(adaptee)和目標接口(target)之間的耦合的。那麼除了這種方式,還有沒有其餘方式來實現兩者的耦合呢?固然有,那就是對象適配器模式。

一言不合,咱們先看代碼:

public class Adapter implements Target
{
    private ThreeInsertSocket adaptee;  
    
    public Adapter(ThreeInsertSocket adaptee) {
        this.adaptee=adaptee;
    }
    
    @Override
    public void twoInsert() 
    {
        adaptee.ThreeInsert();
    }

}

須要改動的就是咱們的適配器類的代碼,能夠看到,對象適配器模式當中,相比類適配器模式,再也不對被適配對象(Adaptee)進行繼承,而是經過適配器類(adapter)的構造函數傳入被適配對象(Adaptee)的實例,而後經過委託該實例實現target接口當中定義的方法(twoInsert)

public class test {

    public static void main(String[] args)
    {
        //正常實現了目標接口的普通功能類
        Target concreteTarget = new ConcreteTarget();  
        concreteTarget.twoInsert();  
          
        // 使用特殊功能類,即適配類 
        ThreeInsertSocket adaptee=new ThreeInsertSocket();
        Target adapter = new Adapter(adaptee);  
        adapter.twoInsert();

    }

}
這個插頭有兩個插口
這個插頭有三個插口

能夠看出這時候各種和接口之間的關係圖應該變爲:

那麼至此,咱們的適配器模式也講解完畢,下一節,咱們將開始咱們的重頭戲,javaIO的學習~

相關文章
相關標籤/搜索