背景:
最近的工作是在对接飞鹅打印机,对接打印机厂家的开发平台,后台调用厂家的打印机接口(添加、删除、打印等),然后进行小票的打印,后续需要对接多个品牌的打印机
问题:
不保证商家只有一台和一个品牌的打印机,如果能做一个模板,上层直接调用一个方法,就能兼容多种打印机,我们只需关注各个品牌打印机的接口编写
实现:
四个主要类:
- 商家打印机实体类(表示商家绑定的打印机)
- 打印机实体类(负责打印机的打印,具体品牌的打印机继承于该类)
- 打印机管理者类(包含具体品牌的打印机管理者,负责打印机的管理和使用,代理管理者,负责分发打印机任务给具体品牌的打印机管理者)
- 打印机品牌枚举(包含所有打印机品牌的名称)
类说明:
- 商家打印机实体:具有商家id、打印机品牌,打印机SN码、打印机其他参数属性
- 打印机实体:具有打印小票方法,受保护的(protected)发送请求方法
- 打印机管理者:具有打印机的打印、添加、删除方法
- 打印机代理管理者:具有一个私有的打印机管理者集合,在类加载的时候,遍历打印机品牌枚举,利用反射机制初始化了所有具体品牌的打印机管理者
调用步骤:
打印小票:
- 打印机服务传递订单详情和商家id给打印机代理管理者
- 代理管理者根据商家id,获取商家绑定的打印机列表(商家打印机实体类),并根据各台打印机的品牌,分发给具体的品牌打印机管理者,并传递订单和打印机SN码
- 具体管理者将订单格式化成小票,获取一台打印机,并设置SN码,然后调用打印机的打印方法
添加打印机:
- 打印机服务传递将添加打印机所需参数(具有品牌参数)传递给打印机代理管理者
- 代理管理者跟着打印机品牌,将添加任务分发给具体打印机管理者
- 具体管理者构建添加参数,根据打印机品牌,利用反射机制获取一天对应品牌的打印机,然后调用打印机的发送请求方法
因为该方法是protected权限,上层只能用反射机制来调用,尚未找到比较合适的解决办法
如果换成public权限,我觉得有点不安全
如果在打印机类里实现添加方法,我觉得不符合逻辑,打印机不可能去添加一台打印机,而是被添加的
如果在管理者上实现发送请求的方法,我觉得管理者不应该关注打印机是怎么发送请求的
总结:
- 该方法因为有个代理管理者做中间层,完成了对打印机品牌的判断和任务的分发,具体管理者接收到任务,具体管理者管理着具体品牌的打印机,直接调用打印机的方法即可
- 我们后续对接其他品牌时,只需将品牌名称添加到品牌枚举类,和只需关注具体管理者的任务逻辑,和打印机的接口实现即可
- 因为服务层并不是直接跟具体管理者耦合,代理管理者使两者之间进行了解耦,代理管理者会自动根据已经对接的品牌创建对应管理者,并获取商家的绑定打印机,然后会根据打印机品牌将任务分发给对应具体管理者