抽象类写流程,接口规定必须实现的行为
首先我有一个这样的需求,有一个接收数据的程序,有多种报文格式,且每一种报文对应一个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(); }
public abstract class BaseHandler implements IHandler { @Override final public void handle() {// 实现了流程的控制 print(); doMsg(); save(); doResp(); } }
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"); } }
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抽象类。收工.