1. 程式人生 > >JAVA適配者模式

JAVA適配者模式

目錄

適配者模式

6、總結

紅色代表重點,黑色代表廢話!藍色覺得好看

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、總結

       適配者類的概念關鍵就是將兩個不太相容的整合到適配者類中,然後客戶通過介面卡類能夠呼叫目標類和適配者類兩個的方法。就相當於一個並集!在以後進行開發時可以找類似可以使用這種設計模式的地方,提高程式碼的可重用性,和靈活性!