大家好,我是王有志。前面我通过两篇文章向大家分享了我们最近在做的静态代码分析程序(CA)的定位,能力,使用和设计:
今天呢, 我向各位汇报下在 CA 的设计过程中使用到了哪些设计模式,以及我们是如何运用这些设计模式的。我们在 CA 中主要应用了 3 中设计模式:责任链模式,建造者模式和工厂模式,下面我们聊一下责任链模式和工厂模式的应用。
Tips:CA 项目的地址:https://gitee.com/wyz-A2/CodeAnalysi。
责任链模式的应用
《静态代码分析程序的流程设计》中提到,基于对 CA 项目的需求分析我们在设计主流程时选择了责任链模式,在责任链模式的应用上,我们并没有遵循原教旨主义,让处理节点既承担业务逻辑的功能,又承担链的功能。
我们先来看一下原教旨主义中责任链模式的实现。
定义一个处理节点接口,代码如下:
public interface BaseHandler {
/**
* 负责业务逻辑处理
*/
void handle();
/**
* 设置下一个处理器
* @param handler 处理器
*/
void setNextHandler(BaseHandler handler);
}
再来实现两个处理节点,首先是项目下载处理节点,代码如下:
public class VcsDownloadHandler implements BaseHandler {
private BaseHandler nextHandler;
@Override
public void handle() {
// 这里实现业务逻辑处理
// 这里负责调用下一个处理节点
if (this.nextHandler != null) {
this.nextHandler.handle();
}
}
@Override
public void setNextHandler(BaseHandler handler) {
this.nextHandler = handler;
}
}
接着是差异对比处理节点,代码如下:
public class VcsDifferentHandler implements BaseHandler {
private BaseHandler nextHandler;
@Override
public void handle() {
// 这里实现业务逻辑处理
// 这里负责调用下一个处理节点
if (this.nextHandler != null) {
this.nextHandler.handle();
}
}
@Override
public void setNextHandler(BaseHandler handler) {
this.nextHandler = handler;
}
}
最后我们来使用这个责任链,代码如下:
public static void main(String[] args) {
// 构建处理节点
BaseHandler vcsDownloadHandler = new VcsDownloadHandler();
BaseHandler vcsDifferentHandler = new VcsDifferentHandler();
// 设置处理节点关联关系
vcsDownloadHandler.setNextHandler(vcsDifferent