JAVA中接口和抽象類的妙用-我自己也不知道這個是什麼設計模式

抽象類寫流程,接口規定必須實現的行爲

首先我有一個這樣的需求,有一個接收數據的程序,有多種報文格式,且每一種報文對應一個handler(這個報文的處理類),當有新的報文來臨,程序判斷由哪種handler來處理,且創建對應handler的示例,調用handler的handle方法。

進入handle方法,基本每個報文處理者,都需要進行如下操作:

起初筆者沒有什麼經驗,直接在每個handler的handle方法進行代碼,後來發現考慮到要代碼好看一點,代碼中分出一塊save()方法,用於存儲數據庫。這樣對於我自己一個人來開發沒有任何問題。

但是現在我的這個程序有新的需求,增加了許多種報文格式,這就意味着,需要更多報文處理者。

顯然,我一個人已經不能完成這個工作了,當多人寫代碼的時候,我又想控制他們的流程,就如同上面的的流程圖,他們需要做的,只是去實現每個模塊裏面的代碼部分:

開篇筆者不是說,抽象類寫流程,接口規定必須實現的行爲:

所有的handler都必須繼承抽象類BaseHandler,抽象類BaseHandler也是一種handler,也需要實現接口handle方法,且在BaseHandler中將handle方法設置爲final

接口IHandler

public interface IHandler {
	public void handle();

	/**
	 * 打印
	 */
	public void print();

	/**
	 * 解析報文
	 */
	public void doMsg();

	/**
	 * 入庫
	 */
	public void save();

	/**
	 * 回覆
	 */
	public void doResp();

}

抽象類BaseHandler:

public abstract class BaseHandler implements IHandler {
	@Override
	final public void handle() {// 實現了流程的控制
		print();
		doMsg();
		save();
		doResp();
	}
}

實現類A:

public class AHandler extends BaseHandler implements IHandler {
	@Override
	public void print() {
		System.out.println("A的print");
	}

	@Override
	public void doMsg() {
		System.out.println("A的doMsg");
	}

	@Override
	public void save() {
		System.out.println("A的save");

	}

	@Override
	public void doResp() {
		System.out.println("A的doResp");

	}
}

實現類B:

public class BHandler extends BaseHandler {

	@Override
	public void print() {
		System.out.println("B的print");
	}

	@Override
	public void doMsg() {
		System.out.println("B的doMsg");
	}

	@Override
	public void save() {
		System.out.println("B的save");

	}

	@Override
	public void doResp() {
		System.out.println("B的doResp");

	}

}

然後是測試類:

	public static void main(String[] args) {
		// 收到報文信息
		// 判斷是AHandler
		IHandler aHandler = new AHandler();
		aHandler.handle();
		System.out.println("----------------");

		// 有收到一條報文
		// 判斷是BHandler
		IHandler bHandler = new BHandler();
		bHandler.handle();
	}

得到輸出結果:

A的print
A的doMsg
A的save
A的doResp
----------------
B的print
B的doMsg
B的save
B的doResp


這樣就是實現了,這種方式很多好處:

1由設計者來控制流程,開發者實現各個模塊的細節。分工明確;

2如果突然有一天,我需要變化一下流程,比如我要先doResp再print再doMsg再save(當然,此例子並不合適),我只需要變動BaseHandler,其他代碼都不需要進行變更;

3在BaseHandler的handle()中,我還可以寫入很多公共的東西,比如是日誌記錄,甚至,如果print()每個handler的實現都一致的話,我完全可以在BaseHandler裏面去完成,繼承類A和B就完全不用考慮。

但是有一個問題,仔細看A和B的extends和implement部分,這種設計模式,要求開發者必須extends BaseHandler


小結.接口定義了5中行爲,handle,print,doMsg,save,doResp。抽象類實現了接口handle,並在handle中制定了流程,具體的實現這extends抽象類。收工.









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