適配器模式的適用:
你想使用一個已經存在的類,而它的介面不符合你的需求。
你想建立一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些介面可能不一定相容的類)協同工作。
你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的介面,那麼對象適配器可以適配它的父類介面(僅適用於對象Adapter)。
樣本說明:
這個例子類比了對一個特定組織系統——OrganizationAdaptee的適配。適配器OrganizationAdapter實現了適配介面IOrganization,從而使得用戶端系統可以通過自己的介面IOrganization使用此組織系統——OrganizationAdaptee,而不需要耦合它的API。
package com.alex.designpattern.adapter;
import java.util.HashMap;
import java.util.Map;
/** *//**
* 適配器模式
* <p>
* 將一個類的介面轉換成客戶希望的另外一個介面。 <br>
* Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
*
* @author <a href="mailto:huqiyes@gmail.com">huqi</a>
* @serialData 2007
*/
public class Test ...{
public static void main(String[] args) ...{
Test test = new Test();
IOrganization org = new OrganizationAdapter();
String result = test.genericClientCode(org);
System.out.println("Using client, get result: " + result);
}
private String genericClientCode(IOrganization org) ...{
// We assume this function contains client-side code that only
// knows about IOrganization.
return org.getRole(4);
// other calls to IOrganization go here
// ...
}
}
interface IOrganization ...{
public String getRole(int id);
}
class OrganizationAdaptee ...{
public Map<String, String> queryRole(String id) ...{
System.out.println("Query a Role in the Adaptee Organization, id: "
+ id);
// query using id ... get result
Map<String, String> map = new HashMap<String, String>();
map.put("id", id);
map.put("name", "huqi");
map.put("type", "human");
return map;
}
}
class OrganizationAdapter implements IOrganization ...{
private OrganizationAdaptee adaptee = new OrganizationAdaptee();
public String getRole(int id) ...{
Map result = adaptee.queryRole(String.valueOf(id));
return result.get("id") + ", " + result.get("type") + ", "
+ result.get("name");
}
}