作者:带娃编码两不误的 奇妈
背景
有赞微商城接入了三个厂家的 POS 机,分别是旺 POS、商米、拉卡拉,很久之前都是单独维护这三个 POS 机的代码分支,每次发版就需要把主线分支合并代码到相应的 POS 机的分支,这使得 POS 机的发版流程异常繁琐,而且很容易让 POS 机的版本内容跟微商城手机 App 的版本不一致。
除此之外,每个 POS 机的接入方式和使用方法都有很大的区别,使得对应的业务代码就很混乱。此时恰逢微商城项目要搞模块化,正好借机统一所有 POS 机的代码,让所有 POS 机的使用在业务中是有统一接口去调用,而且把所有代码都合并到主分支,统一 POS 机和手机 App 的发版。
合并代码
首先第一件事情是合并所有 POS 机分支的代码进入主分支,这个过程很艰苦,只能一点点抽取相关代码,然后放到主分支里。刚才在背景中已经提过正在搞模块化,那自然是要把相应的厂家 POS 机的 lib 包和定制的需求的代码放到一个 module 里的。在这里我创建了三个 module,分别 pos_iboxpay,pos_sunmi,pos_wei。
参考下图,因为涉及具体业务,此处不公开代码。
统一调用接口
POS 机定制需求放到相应 module 里以后,那就是如何解决在业务中有统一的接口去调用POS 机的功能的问题了。在业务中,需要使用 POS 机的打印和扫码功能,那么就对应创建了 POSPrinterBuilder,POSBase 和 ScannerBuilder,ScannerBase。
其中POSPrinterBuilder 是在业务中使用的,负责通过发射创建一个 POSPrinter 实例。
POSBase 一个抽象类,pos_iboxpay、pos_sunmi 和 pos_wei 这三个 module 里创建的 POSPrinter 都继承自 POSBase。
备注:因为要在主工程中通过反射来实例化 POSPrinter,所以 POSPrinter 的包名和类名要统一,每个 POS 机 的 module 里创建的 POSPrinter.java 的路径是需要保持一致的。