抽象类写流程,接口规定必须实现的行为
首先我有一个这样的需求,有一个接收数据的程序,有多种报文格式,且每一种报文对应一个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抽象类。收工.