【結構型模式】適配器模式

前言(一些廢話,可以忽略)

  • 4種創建型模式就已經梳理完了,總的來說還是很簡單,只要把握住核心思想,代碼這種具象的東西都不會跑偏
  • 今天來聊一聊第一種,比較簡單的結構型設計模式,適配器模式
  • PS.部分類實現見文末

要解決的問題

  • 適配器模式顧名思義,就是要將一個類與另外一個類連接起來,但是他們的接口關係不匹配,不能直接連接,所以我們只能使用某種結構方式,來講一個接口轉爲另外一個接口可以調用的形式
  • 當然用更簡單的話說,就是起一個轉接頭的作用,像充電器一樣,將220V的電壓轉爲5V
  • 這裏我們使用泰國標準和中國標準的插座來進行舉例

基於類的適配器模式

  • 既然是基於類的,那麼被適配、被轉換的對象就是需要們繼承的一個類
/**
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public class ThailandStandard {

    public void charge(){
        System.out.println("給手機充電");
    }
}
  • 我們要使用的是中國標準,通過一個指定中國標準的接口
/**
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public interface ChinaStandard {
    void charge();
}
  • 不能直接使用泰國標準,所以需要將其轉換爲中國標準
/**
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public class ClassAdapter extends ThailandStandard implements ChinaStandard {
}
  • 基本結構就已經完成了,接下來再看一下如何使用
  • 通過創建一個適配器對象,就可以獲得一個兼容中國標準的子類,但是當你實際調用時,使用的卻是泰國的插座,這就達到了我們的效果
/**
 * 類對象適配器
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public class ClassMode {
    public static void main(String[] args) {
        ChinaStandard chager = new ClassAdapter();
        chager.charge();
    }
}
  • 基於類的適配器模式,通過繼承來實現轉換,而我們知道,繼承這東西不具有靈活性,且有較強的依賴性,是不推薦使用的,那麼我們有沒有什麼更好的方式呢

基於對象的適配器模式

  • 基於對象的適配器,不再採用繼承的方式,而是通過聚合的方式,這樣就適當降低了依賴,更加的靈活
  • 聚合的是被轉換類的對象,所以稱爲基於對象的適配器模式
/**
 * 對象適配器
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public class ObjectAdapter implements ChinaStandard {
    private ThailandStandard thailandStandard;
   
    public ObjectAdapter(ThailandStandard thailandStandard) {
        this.thailandStandard = thailandStandard;
    }

    @Override
    public void charge() {
        thailandStandard.charge();
    }
}
  • 其他的相關類無需變動,當然這裏也可以用組合的方式

基於接口的適配器模式

  • 最後一種適配器模式的方式爲基於接口,將被適配的類通過實現接口,將需要的轉接寫在抽象類中
  • 下面爲我們要實現的類
/**
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public interface ThailandStandard {
    void charge();

    void quickCharge();
}
  • 我們的適配器去實現被適配的接口
/**
 * 接口適配器
 *
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public abstract class InterfaceAdapter implements ThailandStandard {
    @Override
    public void charge() {
        System.out.println("InterfaceAdapter.charge");
    }

    @Override
    public void quickCharge() {
        throw new UnsupportedOperationException();
    }
}
  • 轉接爲中國的標準後,可以加上自己的相關實現方法,比如說降壓之類的
/**
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public class ChinaStandard extends InterfaceAdapter{
}
  • 這就是使用過程
/**
 * 接口適配器
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2019-12-26 26:21
 **/
public class InterfaceMode {
    public static void main(String[] args) {
        ChinaStandard standard = new ChinaStandard();
        standard.charge();
    }
}

總結

  • 適配器模式大概就是這三種了,主要根據已經存在的類進行選擇使用哪一種模式
  • 這個模式的核心就是將一個我們要使用的類通過繼承、實現 、聚合組合,轉爲我們另外一個我們可以直接調用的類, bingo!

願你不捨愛與自由。

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