抽象類寫流程,接口規定必須實現的行爲
首先我有一個這樣的需求,有一個接收數據的程序,有多種報文格式,且每一種報文對應一個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抽象類。收工.