java設計模式精講 Debug 方式+記憶體分析 第12章 介面卡模式
阿新 • • 發佈:2018-12-05
介面卡模式
12-1 介面卡模式講解
12-2 介面卡模式coding
有一個被介面卡類:
public class Adaptee {
public void adapteeRequest() {
System.out.println("被適配者的方法");
}
}
這個是目標方法的介面:
public interface Target {
void request();
}
這個是目標方法的實現:
/** 具體的實現類 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目標方法");
}
}
而這個就是適配類:繼承於被適配類,實現目標方法的介面:
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
我們來進行測試一下:
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 現在,我們就來通過介面卡類來進行實現 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
測試結果如下:
ConcreteTarget目標方法
被適配者的方法
這個時候,我們呼叫適配類裡面的方法,然後轉到被適配類裡面的方法:
以上的就是類介面卡模式;
現在的類圖為:
現在,我們來說說物件介面卡模式:
同上面一樣:有一個目標介面
public interface Target {
void request();
}
還有一個具體的目標類:
/** 具體的實現類 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目標方法");
}
}
以及被適配的類:
public class Adaptee {
public void adapteeRequest() {
System.out.println("被適配者的方法");
}
}
適配類和上面的有一些不同,這裡被適配類不是繼承過來的,而是作為屬性組合到裡面來,然後通過物件來呼叫被適配類裡面的方法:
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
現在,我們來測試一下:我們在拷貝的時候,一定要注意包是否引對
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 現在,我們就來通過介面卡類來進行實現 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
執行結果:和上面的類介面卡模式的執行結果一樣
ConcreteTarget目標方法
被適配者的方法
這個就是現在的類圖:
在繼承和組合的時候,我們優先使用組合;
我們再類引入一個生活場景:手機充電器的介面卡,將220V的交流電轉換成5V的直流電:
首先有一個被適配的類:220V的類
public class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("輸出220V的交流電"+output+"V");
return output;
}
}
我們有一個目標方法的介面:轉為5V的直流電
public interface DC5 {
int outputDC5V();
}
這個就是適配類:
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
/** 變壓器 */
int adapterOutput = adapterInput / 44;
System.out.println("通過PowerAdapter電源介面卡輸入AC"+adapterInput+"V"+"輸出DC:"+adapterOutput+"V");
return adapterOutput;
}
}
public class Test {
public static void main(String[]args){
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
執行結果:
輸出220V的交流電220V
通過PowerAdapter電源介面卡輸入AC220V輸出DC:5V
12-3 介面卡模式原始碼解析(jdk+spring+springjpa+springmvc)
- XmlAdapter
- AdvisorAdapter
- 在JPA裡面也大量的使用到介面卡模式
- HandlerAdapter