JAVA適配者模式
目錄
紅色代表重點,黑色代表廢話!藍色覺得好看。
1、介面卡模式的概念
Adapter pattern 介面卡模式:按照我得理解就是一個手機的轉換頭,將兩個不相容的東西能夠混在一起用!
介面卡模式:將一個類的介面轉換成客戶希望的另一個介面。介面卡模式讓哪些介面不相容的類可以一起工作。
現實中的介面卡例子就是充電線,在傳輸過程中我們是高壓傳輸電流,到了家裡一般來說都是220V!但是我們手機,電視機,冰箱等。使用的並沒有220V,這個時候充電線就相當於了一個介面卡!目的就是讓手機幾V的電壓能夠使用220V的電壓!總而言之,言而總之:介面卡就是讓兩個不相容的類能夠一起用!
2、介面卡的UML圖
介面卡模式包括兩種型別:類介面卡和物件介面卡!類介面卡,適配者和介面卡是繼承或實現的關係,物件介面卡中,適配者和介面卡是關聯關係。由於JAVA單繼承所以一般來說物件介面卡更加常用也更加靈活!
Target: 目標類,目標抽象類定義客戶所需的介面,可以是一個抽象類,介面或者是具體類。在類介面卡中只能夠是介面!因為JAVA只支援單繼承但可以多實現!
Adapter:介面卡類,它通過繼承一個目標類,呼叫另一個介面。使其產生練習!Adapter是介面卡模式的核心類!在類介面卡中,介面卡類通過繼承適配者類和實現目標類,通過繼承實現的方式使其產生聯絡。在物件介面卡中,通過繼承目標類關聯適配者使其產生聯絡。
Adaptee:適配者類,它一般來說是定義的一個介面,然後有客戶端所需要的方法。
類介面卡UML圖:
public class Adapter implements Adaptee extends Target{
//實現了Target的方法
public void request(){
//使用的是Adaptee中的實現
super.specificRequest();
}
}
物件介面卡UML圖:
public class Adapter extends Target{ //物件介面卡 //關聯適配者類 private Adaptee adaptee; //建立適配者 public Adapter(){ adaptee = new Adaptee; } //呼叫 public run (){ adaptee.specificRequest(); } }
兩者最大的不同在於,繼承還是呼叫!
3、介面卡的實現
做一個簡單的實現:當警車跑,邊跑邊叫邊發光。
目標類:carcontroller
package AdapterPattern;
/**
*
* <p>Title: CarController</p>
* <p>Description: 此類為介面卡模式中的目標抽象類模擬的汽車控制類</p>
* @author HAND_WEILI
* @date 2018年8月21日
*/
public abstract class CarController {
//此方法中有一個可以移動的方法 。
public void move() {
System.out.println("玩具汽車正在移動");
}
//抽象兩個方法一個控制聲音,一個控制燈光,這兩個方法是另外兩個介面的方法,需要通過介面卡獲取。
public abstract void voice();//聲音
public abstract void light(); //燈光
}
適配類:PoliceLight
package AdapterPattern;
/**
*
* <p>Title: PoliceLight</p>
* <p>Description:類似於聲音類 </p>
* @author HAND_WEILI
* @date 2018年8月21日
*/
public class PoliceLight {
public void alarmLight() {
System.out.println("發出燈光");
}
}
適配類:PoliceSound
package AdapterPattern;
/**
*
* <p>Title: PoliceSound</p>
* <p>Description: 此類為是Aptee類,簡單的說就是這個類的方法,目標類想要用,我們需要通過介面卡獲得這個方法</p>
* @author HAND_WEILI
* @date 2018年8月21日
*/
public class PoliceSound {
//sound
public void alarmSound() {
System.out.println("發出警笛聲");
}
}
介面卡類:PoliceCarAdapter
package AdapterPattern;
/**
*
* <p>Title: PoliceCarAdapter</p>
* <p>Description:此類是介面卡模式中的的介面卡類,介面卡就像一個變壓器,將不同的類結合在一起或者說通訊 </p>
* @author HAND_WEILI
* @date 2018年8月21日
*/
public class PoliceCarAdapter extends CarController {
private PoliceLight policeLight;
private PoliceSound policeSound;
//此處用的是物件介面卡s
public PoliceCarAdapter() {
//此構造方法用來new對應的適配類
policeLight = new PoliceLight();
policeSound = new PoliceSound();
}
@Override
public void voice() {
// TODO Auto-generated method stub
//記得要新建new物件
policeLight.alarmLight();
}
@Override
public void light() {
// TODO Auto-generated method stub
policeSound.alarmSound();
}
}
這個例項使用的是物件介面卡模式,更加方便常用靈敏!
4、介面卡的優缺點
介面卡模式將現有介面轉化為客戶類所期望的介面,實現了對現有類的複用,它是一種使用頻率非常高的設計模式,在軟體開發中得到了廣發的應用。
優點:
1、 將目標類和適配者類解耦,通過介面卡類進行適配者類的重用,無需再改變原有的結構。
2、增加了類的透明性和複用性,將業務的實現過程封裝再適配者類中,一個適配者可以通過不同的介面卡再不同的系統中進行復用。
3、靈活性和擴充套件性都非常好,通過使用配置檔案可以很方便地更換介面卡,也可以不修改原始碼的基礎上增加新的介面卡類。
缺點:
1、對於JAVA、C#之類的單繼承面向物件的語言,一次只能適配一個適配類不能同時適配多個適配者類。
2、適配者不能夠是最終類,因為需要繼承。在JAVA中就是不能為Final類!
5、適合的場景
在以下情況下可以考慮使用適配者模式:
1、系統需要使用一些現有的類,而這些現有的類不符合系統的需要,比如名字,比如方法設定衝突。
2、想建立一個可以重複使用的類,用於和一些彼此之間沒有太大關聯的類,包括第三方類。要一起工作!
6、總結
適配者類的概念關鍵就是將兩個不太相容的整合到適配者類中,然後客戶通過介面卡類能夠呼叫目標類和適配者類兩個的方法。就相當於一個並集!在以後進行開發時可以找類似可以使用這種設計模式的地方,提高程式碼的可重用性,和靈活性!