適配器模式的用例

適配器模式:適配器模式是將接口改造成用戶希望的接口,適配器讓原本和接口不兼容的類能和接口一起工作。

下面是一個工作用到的適配器擴展模式


如類圖所示,我們擁有一個目標接口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);
	}
}

運行結果

實現簡單的業務...


實現過濾器的業務
實現複雜的具體的業務...
實現業務後的善後工作


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章