在开发过程中经常会遇到不同系统的集成integraion。例如:A系统的一个版本可能会支持B系统的若干版本,而B系统的不同版本间的接口有可能会更改(好的系统设计一般不会改接口的,至少也会向下兼容)或者处理流程有一些改变。
对于这种情况,在开发初期为了赶进度,代码中充斥着if...else...的版本判断
if (B.version == 1.0) {
//do something here
} else (B.version == 1.1) {
//do something here
} else {
//do something here
}
这样的代码不够优雅,也不够灵活,日后若需要支持新的版本,还要增加else语句。
因此,需要对上述代码进行重构,其中重构的方法之一就是在用代理模式proxy pattern。
比如系统集成的接口是 BSystemIntegraion, 在BSystemIntegraionImpl中有一些if...else...的代码。
现在可以定义一个BSystemIntegraionImplProxy 类,也实现BSystemIntegraion接口。A系统对于B系统不同版本的公共功能的方法实现放在BSystemIntegraionImpl类中,不同版本若有不同于公共实现的处理,可以放在各自的实现类BSystemIntegraionImplVer10/BSystemIntegraionImplVer11/BSystemIntegraionImplVer12中,这些类继承了BSystemIntegraionImpl类,也可以
BSystemIntegraionImpl<--BSystemIntegraionImplVer10<--BSystemIntegraionImplVer11<--BSystemIntegraionImplVer12。
(根据实际情况确定不同版本实现类之间的继承关系。)
在BSystemIntegraionImplProxy 类中定义不同版本实现的实例,比如:
private BSystemIntegraion bSysIntegraionVer10;
private BSystemIntegraion bSysIntegraionVer11;
private BSystemIntegraion bSysIntegraionVer12;
private BSystemIntegraion bSysIntegraionImpl;
在BSystemIntegraionImplProxy 类中定义一个private方法,用于根据不同的版本返回不同的实现。
private BSystemIntegraion getBSystemIntegraionImpl(args) {
if (B.version==1.0) return bSysIntegraionVer10;
if (B.version==1.1) return bSysIntegraionVer11;
if (B.version==1.2) return bSysIntegraionVer12;
return bSysIntegraionImpl;
}
在BSystemIntegraionImplProxy 类实现BSystemIntegraion接口的方法中,可以这样写
@Override
public BusinessObject bizFunction1(args) {
return this.getBSystemIntegraionImpl(args).bizFunction1(args);
}
在Spring配置文件中,分别定义BSystemIntegraionImplVer10、BSystemIntegraionImplVer11、BSystemIntegraionImplVer12 bean,并把他们注入到 BSystemIntegraionImplProxy bean定义中,把原来spring配置文件中引用BSystemIntegraionImpl ben的地方改成引用BSystemIntegraionImplProxy bean。
这样代码就清晰多了。
以后新增B系统版本的支持,需要
1)定义新的实现类,比如BSystemIntegraionImplVer13,
2)修改BSystemIntegraionImplProxy 类,并增加BSystemIntegraion bSysIntegraionVer13属性,修改getBSystemIntegraionImpl(args)方法,
3)修改spring配置文件。
这里是工作中的一些记录,如果各位有更好的方法,欢迎指教。谢谢!