业务逻辑层接口设计
功能
用于提供业务逻辑接口,将业务细分成独立单元。
目标
- 细分接口,功能内聚
- 数据私有化,避免线程安全方面的Api调用, 减少因线程安全性方面导致的偶现性问题
- 屏蔽实现细节,方便配置mock实体,方便编写单元测试
- 杜绝线程调度,以支持单元测试的运行
- 模块之间相对独立
原理
业务逻辑层构建业务服务器(BussinessServer)和服务(Service)两个抽象概念。业务服务器承担创建服务对象、各个服务之间相互通讯的中心枢纽等职能。而服务则将功能内聚的接口抽象成独立单元。我们主张将一个功能拆分成各个服务,每个服务只提供单个职能的接口。每个服务实现只做逻辑实现,不做数据存储。接口设计秉承依赖注入的设计思路,各个服务都以接口的形式被相互引用,这样保证了代码的高内聚,低耦合,同时也可以做到实现类可配置的功能,方便编写单元测试或者代码的修改。
原理图如下:
接口
Business
业务逻辑层的门面类,提供业务接口。
- 方法
T getService(class<T> className);
获取制定服务接口T的服务实体对象
IService
服务接口基类,所有服务接口都要继承此类。
* 方法
* long getServiceId()
获取获取实体对象的id。
* init()
初始化接口。
* unint()
反初始化接口 。
Service
IService接口的实现基类,所有业务服务都要继承此类
- 方法
setServer(Server Server)
设置业务服务器
Server
业务服务器,用来管理各种服务,所有服务都拥有该实体对象,是各种服务相互通信的桥梁。
- 方法
void setServiceBinder(IServiceBinder serviceBinder)
设置服务绑定器T getService(class<T> className);
获取制定服务接口T的服务实体对象
IServiceBinder
服务绑定器,用来绑定接口及实现。
- 方法
<T> void bind(Class<T> interfaceCls, Class<? extends T> implCls)
绑定接口与实现
示例
现在以下载需求为例,用户选择多个平台文件下载到本地。设计类图如下: