1. 程式人生 > >【本人禿頂程式設計師】Java設計模式-介面卡模式

【本人禿頂程式設計師】Java設計模式-介面卡模式

←←←←←←←←←←←← 快,點關注!

介面卡模式(Adapter Pattern):將一個介面轉換成呼叫者希望的另一個介面,使介面不相容的那些類可以一起工作,其別名為包裝類(Wrapper),該模式可以作為類結構型模式,也可以作為物件結構型模式

介面卡模式應該是 Android 開發當中最常見的幾個設計模式之一了,各種各樣的列表(ListView,GridView,RecyclerView)都要使用一個 Adapter 的類

使用場景:

  • 系統需要使用現有的類,而這些類的介面不符合系統的需要
  • 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作

介面卡模式一個可以分為三個介面卡:

  • 類介面卡
  • 物件介面卡
  • 預設介面卡

類介面卡

在這裡插入圖片描述

  • Target:目標角色,可以是一個抽象類或介面,由於是類介面卡,不能為具體類
  • Adaptee:適配者類,一般是一個具體類,包含期望的業務方法,某些情況下可能沒有適配者的原始碼
  • Adapter:介面卡類,可以把源介面轉換成目標介面
    在這裡插入圖片描述

使用 Mac 的同學應該很熟悉上面的兩個東西,Apple 的充電器可以把兩腳的充電頭拔掉換成一個更長且是三腳的充電頭,下面就以這兩個東西為示例,完成一個介面卡模式,示例程式碼:
Target 類:

public interface Power {
   /**
   * 充電
   */
   void charge();
}

在正常情況下用兩腳的插頭已經足夠滿足需求了,但是現在所處的環境只有三腳的插板,現在就可以把只支援三腳的插板看做是現有的介面,而預設的充電是不支援此介面的,這時候就需要用到三腳的介面卡,示例程式碼:
Adaptee 類,期望實現的功能:

public class ExtensionPower {
   public void specificPower() {
      LogUtils.i("用三腳,1.8米延長線充電");
   }
}

Adapter 類,三腳延長線:

public class PowerAdapter extends ExtensionPower implements Power{
   @Override
   public void charge() {
      super.specificPower();
   }
}

Client 類:

public class Client {
   PowerAdapter powerAdapter = new PowerAdapter();
   powerAdapter.charge();
}

利用介面卡模式就可以解決上述的問題,並且非常符合開閉原則

物件介面卡

在這裡插入圖片描述

物件介面卡不在使用類介面卡繼承再實現的方式,而是採用直接關聯的方式,區別就在於 adapter 類:

public class PowerAdapter implements Power {
   private ExtensionPower extensionPower;
   // 此處改為直接關聯的方式
   public PowerAdapter(ExtensionPower extensionPower) {
   this.extensionPower = extensionPower;
   }
   @Override
   public void charge() {
   this.extensionPower.specificPower();
   }
}

預設介面卡

在這裡插入圖片描述

當我們只想實現一個介面 N 多個方法中的一個時,就要用到該模式了,在具體實現類和介面中間設計一個抽象類實現該介面,並提供所有方法的空實現,具體實現類就可以繼承抽象類,這樣就可以選擇自己想要實現的某一介面
舉個栗子:一個已婚人士的生活是吃飯,睡覺以及啪啪啪,但是現在需要需要新增一個新的物種叫做單身狗,單身狗當然是沒有啪啪啪功能的,這個時候就需要建立一個抽象類實現已婚人士這個介面,並讓單身狗繼承實現吃飯和睡覺的功能
示例程式碼:
已婚人士介面:

public interface MarriedPeople {
   /**
   * 吃飯
   */
   void eat();
   /**
   * 睡覺
   */
   void sleep();
   /**
   * 啪啪啪
   */
   void papapa();
}

抽象類:

public abstract class Adults implements MarriedPeople {
   @Override
   public void eat() {
   }
   @Override
   public void sleep() {
   }
   @Override
   public void papapa() {
   }
}

單身狗:

public class SingleDog extends Adults {
   public void eat() {
   LogUtils.i("吃飯");
   }
   public void sleep() {
   LogUtils.i("睡覺");
      }
}

說了這麼多,該到總結的時候了,介面卡模式優點:

  • 使用介面卡類達到重用先用適配者類,無須修改原有結構
  • 增加類的透明性和複用性,具體業務邏輯都封裝在適配者類中,提高適配者的複用性

歡迎大家加入粉絲群:963944895,群內免費分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務、Dubbo框架、Redis快取、RabbitMq訊息、JVM調優、Tomcat容器、MySQL資料庫教學視訊及架構學習思維導圖