java設計模式只介面卡模式
前端時間學習springmvc的時候,老是不理解處理器介面卡的作用,到今天位置才勉強理解處理器介面卡,雖說原始碼還是看不懂,但也勉強收穫,或者是理解了一個設計模式。
設計模式之介面卡模式
在springmvc中,使用者向伺服器傳送請求,前端控制器接受請求,呼叫處理器介面卡傳遞url得到處理器,呼叫處理器介面卡才能執行這個請求,並返回modelAndView,處理器介面卡在這裡扮演了一個很重要的角色,因為你的handler並不知道是屬於那個控制器(controller有老多種啊),所以它的通過處理器介面卡來找到控制器,繼而執行handler,返回modelandview。
介面卡模式的概念
介面卡模式把一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。
舉個例子
用電器做例子,膝上型電腦的插頭一般都是三相的,即除了陽極、陰極外,還有一個地極。而有些地方的電源插座卻只有兩極,沒有地極。電源插座與膝上型電腦的電源插頭不匹配使得膝上型電腦無法使用。這時候一個三相到兩相的轉換器(介面卡)就能解決此問題,而這正像是本模式所做的事情。
介面卡模式有類的介面卡模式和物件的介面卡模式兩種不同的形式。
類介面卡模式:
原理:通過繼承來實現介面卡功能。
當我們要訪問的介面A中沒有我們想要的方法 ,卻在另一個介面B中發現了合適的方法,我們又不能改變訪問介面A,在這種情況下,我們可以定義一個介面卡p來進行中轉,這個介面卡p要實現我們訪問的介面A,這樣我們就能繼續訪問當前介面A中的方法(雖然它目前不是我們的菜),然後再繼承介面B的實現類BB,這樣我們可以在介面卡P中訪問介面B的方法了,這時我們在介面卡P中的介面A方法中直接引用BB中的合適方法,這樣就完成了一個簡單的類介面卡。
定義想要使用功能的介面
/**
* @Description:這是一個電腦,只能插入圓形插口的耳機
* @Author: zc
* @CreateDate: 2018/12/16$ 21:15$
*/
public interface CirCle {
public void music();
}
定義電腦介面的實現類
/**
* @Description:圓形介面耳機的實現類
* @Author: zc
* @CreateDate: 2018/12/16$ 21:20$
*/
public class CirCleBean implements CirCle {
@Override
public void music() {
System.out.println("我是圓形介面的耳機,聽歌啊");
}
}
定義介面卡,通過這個介面卡可以間接的插入電腦
/**
* @Description:我是介面卡,圓形正方形耳機插入我,我插入電腦的圓形介面,你就能聽歌了
* @Author: zc
* @CreateDate: 2018/12/16$ 21:24$
*/
public class AdapterFormSquToCir extends CirCleBean implements Square {
//主人帶的二級還是那個方型的沒變。。。
@Override
public void squareMusic() {
music();
}
}
定義測試類
public class Deo1 {
public static void main(String[] args) {
AdapterFormSquToCir adapterFormSquToCir = new AdapterFormSquToCir();
adapterFormSquToCir.squareMusic();
}
}
我是圓形介面的耳機,聽歌啊
物件介面卡模式
原理:通過組合來實現介面卡功能。
當我們要訪問的介面A中沒有我們想要的方法 ,卻在另一個介面B中發現了合適的方法,我們又不能改變訪問介面A,在這種情況下,我們可以定義一個介面卡p來進行中轉,這個介面卡p要實現我們訪問的介面A,這樣我們就能繼續訪問當前介面A中的方法(雖然它目前不是我們的菜),然後在介面卡P中定義私有變數C(物件)(B介面指向變數名),再定義一個帶引數的構造器用來為物件C賦值,再在A介面的方法實現中使用物件C呼叫其來源於B介面的方法。
定義想要使用功能的介面
/**
* @Description:這是一個電腦,只能插入圓形插口的耳機
* @Author: zc
* @CreateDate: 2018/12/16$ 21:15$
*/
public interface CirCle {
public void music();
}
/**
* @Description:圓形介面耳機的實現類
* @Author: zc
* @CreateDate: 2018/12/16$ 21:20$
*/
public class CirCleBean implements CirCle {
@Override
public void music() {
System.out.println("我是圓形介面的耳機,聽歌啊");
}
}
定義介面卡
/**
* @Description:我是介面卡,圓形正方形耳機插入我,我插入電腦的圓形介面,你就能聽歌了
* @Author: zc
* @CreateDate: 2018/12/16$ 21:24$
*/
public class AdapterFormSquToCir extends CirCleBean implements Square {
private CirCle cirCle;
public AdapterFormSquToCir(CirCle cirCle) {
this.cirCle = cirCle;
}
//主人帶的二級還是那個方型的沒變。。。
@Override
public void squareMusic() {
music();
}
}
測試
/**
* @Description:
* @Author: zc
* @CreateDate: 2018/12/16$ 21:29$
*/
public class Deo1 {
public static void main(String[] args) {
AdapterFormSquToCir adapterFormSquToCir = new AdapterFormSquToCir(new CirCleBean());
adapterFormSquToCir.squareMusic();
}
}
4、介面卡模式應用場景
類介面卡與物件介面卡的使用場景一致,僅僅是實現手段稍有區別,二者主要用於如下場景:
(1)想要使用一個已經存在的類,但是它卻不符合現有的介面規範,導致無法直接去訪問,這時建立一個介面卡就能間接去訪問這個類中的方法。
(2)我們有一個類,想將其設計為可重用的類(可被多處訪問),我們可以建立介面卡來將這個類來適配其他沒有提供合適介面的類。
以上兩個場景其實就是從兩個角度來描述一類問題,那就是要訪問的方法不在合適的接口裡,一個從接口出發(被訪問),一個從訪問出發(主動訪問)。
介面介面卡使用場景:
(1)想要使用介面中的某個或某些方法,但是介面中有太多方法,我們要使用時必須實現介面並實現其中的所有方法,可以使用抽象類來實現介面,並不對方法進行實現(僅置空),然後我們再繼承這個抽象類來通過重寫想用的方法的方式來實現。這個抽象類就是介面卡。