1. 程式人生 > >設計模式之介面卡模式(Adapter)

設計模式之介面卡模式(Adapter)

            介面卡模式就是將一個系統的介面轉換成另一種形式,從而使原來不能直接呼叫的介面可以呼叫。

在上篇文章當中,我們提到了外觀模式,外觀模式為外系統的呼叫提供了一個統一的介面,以此來降低系統間的耦合度,那麼我們來想一下這樣的應用場景,假如有多個外系統要呼叫子系統的統一介面的某個方法,但是他們所需要的返回值又是不同的型別,比如說有的需要返回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!");
	}
	

}