設計模式之介面卡模式(Adapter)
阿新 • • 發佈:2019-02-02
介面卡模式就是將一個系統的介面轉換成另一種形式,從而使原來不能直接呼叫的介面可以呼叫。
在上篇文章當中,我們提到了外觀模式,外觀模式為外系統的呼叫提供了一個統一的介面,以此來降低系統間的耦合度,那麼我們來想一下這樣的應用場景,假如有多個外系統要呼叫子系統的統一介面的某個方法,但是他們所需要的返回值又是不同的型別,比如說有的需要返回string型別,有的需要返回Map型別等,而如果針對每個外系統的呼叫分別編寫一個方法顯然不可行,這時我們就可以使用Adapter模式了。
下面我們來看一個例子:
Facade類:
package com.dxy.design.pattern.builder.adapter; import java.util.ArrayList; import java.util.List; public class Facade { public List getList() { List list = new ArrayList(); list.add("hello"); list.add("word"); return list; } }
而外系統需要的是一個Map型別的值,外系統呼叫類Application.java:
package com.dxy.design.pattern.builder.adapter;
import java.util.HashMap;
public class Application {
public static void execute(HashMap map) {
for(int i=0;i<map.size();i++) {
System.out.println(map.get(i+""));
}
}
}
外系統需要的是Map型別的引數,而子系統返回給我們的是一個List型別,這時我們就可以時候Adapter模式將List型別轉換為Map型別Adapter類如下:
package com.dxy.design.pattern.builder.adapter; import java.util.HashMap; import java.util.List; public class Adapter extends HashMap{ private List list; public Adapter(List list) { this.list = list; } public int size() { return list.size(); } public Object get(Object i) { return list.get(Integer.valueOf(i.toString()).intValue()); } }
我們就可以在客戶端呼叫:
package com.dxy.design.pattern.builder.adapter;
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
Adapter adapter = new Adapter(facade.getList());
Application.execute(adapter);
}
}
這樣外系統就可以成功使用子系統的方法。spring中的請求分發器,io中的輸入輸出都使用了Adapter模式。java的api在設計過程中使用了預設的介面卡模式:有一個介面,裡面定義了很多方法,但在實現類中只需要一個方法,這樣就可以定義一個實現了這個介面的抽象類,然後去實現這個抽象類來完成需要的操作:
package com.designpattern.adapter;
public interface Phone {
public void sendMessage();
public void surfInternet();
public void receiveCall();
public void AsAlarm();
}
package com.designpattern.adapter;
public abstract class ChinaMobile implements Phone {
@Override
public void AsAlarm() {
// TODO Auto-generated method stub
}
@Override
public void receiveCall() {
// TODO Auto-generated method stub
}
@Override
public void sendMessage() {
// TODO Auto-generated method stub
}
@Override
public void surfInternet() {
// TODO Auto-generated method stub
}
}
package com.designpattern.adapter;
public class MyPhone extends ChinaMobile {
@Override
public void AsAlarm() {
System.out.println("I just use it as a alarm!");
}
}