適配器模式:適配器模式是將接口改造成用戶希望的接口,適配器讓原本和接口不兼容的類能和接口一起工作。
下面是一個工作用到的適配器擴展模式
如類圖所示,我們擁有一個目標接口Target,包含一個方法doBusiness,一個需要被適配的類Adaptee,包含三個方法,還有我們的核心適配器類Adapter,這是一個抽象類。
再看兩個實現類,一個是簡單的實體類,直接實現了Target的實體類SimpleConcreteTarget,另外一個是實現適配器類的實體類MultipleConcreteTarget。爲什麼這麼設計呢,
在簡單業務的時候,我們不需要被適配器類Adpater的功能,那麼我們直接實現目標接口Target就行。在複雜業務的情況,目標接口滿足不了我們的要求,而Adaptee正好擁有我們需要的功能,那麼我們就繼承適配器類Adapter,將源接口改造我們需要的接口。
用例:
目標接口
package com.adapter;
public interface Target {
public void doBusiness(BaseReq req);
}
具有複雜功能的功能類Adaptee
package com.adapter;
public abstract class Adaptee {
/**
* 過濾
* @param req
*/
abstract void doFilter(BaseReq req);
/**
* 業務
* @param req
*/
abstract void doExecute(BaseReq req);
/**
* 業務後處理
* @param req
*/
abstract void doEnd(BaseReq req);
}
適配器類Adapter,在適配器類中,我們改造了原有的doBusiness方法,讓他實現了具有複雜功能的類,這樣他就有了Adapte的功能。
package com.adapter;
/**
* 適配器類
* @author Administrator
*
*/
public abstract class Adapter extends Adaptee implements Target {
@Override
public void doBusiness(BaseReq req) {
doFilter( req);
doExecute(req);
doEnd(req);
}
@Override
abstract void doFilter(BaseReq req);
@Override
abstract void doExecute(BaseReq req);
@Override
abstract void doEnd(BaseReq req);
}
簡單功能的實現類SimpleConcreteTarget,在簡單的實現類SimpleConcreteTarget,我們只是實現了原有接口的方法,因爲我們不需要複雜的邏輯,所以不需要實現適配器類。
package com.adapter;
public class SimpleConcreteTarget implements Target {
@Override
public void doBusiness(BaseReq req) {
System.out.println("實現簡單的業務..."+"\n");
}
}
複雜功能的實現類MultipleConcreteTarget,在複雜實現類中,由於原有接口Target中的接口無法滿足我們功能的要求,所以我們需要實現適配器類,獲取適配器的功能。
package com.adapter;
public class MultipleConcreteTarget extends Adapter {
@Override
void doFilter(BaseReq req) {
System.out.println("實現過濾器的業務");
}
@Override
void doExecute(BaseReq req) {
System.out.println("實現複雜的具體的業務...");
}
@Override
void doEnd(BaseReq req) {
System.out.println("實現業務後的善後工作");
}
}
請求類BaseReq
package com.adapter;
public class BaseReq {
private String functionCode;
public String getFunctionCode() {
return functionCode;
}
public void setFunctionCode(String functionCode) {
this.functionCode = functionCode;
}
}
工具類ServiceUtil
package com.adapter;
import java.util.HashMap;
import java.util.Map;
public class ServiceUtil {
private static Map map = new HashMap();
static{
map.put("001", SimpleConcreteTarget.class);
map.put("002", MultipleConcreteTarget.class);
}
public static Target getTarget(BaseReq req){
Class cls = (Class) map.get(req.getFunctionCode());
try {
return (Target) cls.newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args){
BaseReq req = new BaseReq();
req.setFunctionCode("001");
System.out.println(getTarget(req));
}
}
測試類
package com.adapter;
import org.junit.Test;
public class TestAdapter {
@Test
public void testAdapter(){
BaseReq req = new BaseReq();
req.setFunctionCode("001");
Target target = ServiceUtil.getTarget(req);
target.doBusiness(req);
req.setFunctionCode("002");
target = ServiceUtil.getTarget(req);
target.doBusiness(req);
}
}
運行結果
實現簡單的業務...
實現過濾器的業務
實現複雜的具體的業務...
實現業務後的善後工作