1. 目的
将业务层的方法调用,变成非显式调用,有利于界面的自动化测试。
2. 动机
在编写客户端代码的时候,很多Action 都是直接调用业务层方法(或者通过Presenter 负责调用),这样就会使界面的代码直接依赖业务层代码,在进行单元测试的时候会为业务层接口打很多的桩,工作量较大。而且界面的单元测试,主要是测试界面的布局、界面的逻辑和用户响应等,在单元测试阶段很少会涉及业务的逻辑。
3. 参与者
1, Presentation: 主要负责界面的展现和用户操作的接受。
2. Presenter: 主要负责用户的界面操作,转发用户的业务操作。
3. Domain Binder: 主要负责连接表现层和领域逻辑层。
4. Domain Accessor: 主要负责领域逻辑层的访问。
5. Domain Logic: 主要负责处理业务逻辑。
4. 协作
说明:
1.图中的虚线为非显式调用;
2.图中的实线为直接方法调用;
5. 实现
实现流程图如下:
由于只能加3个附件,所以其它流程图不能够加进来,具体可能参见源代码吗?
5. 结果
表现层不直接依赖领域层,用户在进行业务操作时,Presenter 会将业务操作封装成一个Domain Event 发到Domain Accessor。 Domain Event 封装了操作的类型和参数。当系统需要多客户端同步时,Domain Accessor 会接收到领域层发来的事件,然后再将该事件转换成Domain Event 发出去,表现层会收到事件然后作相应的处理。
6. 特点
优点:该模式有利于界面的单元测试或自动化测试,也使开发界面的人不关心业务逻辑,开发业务逻辑的人不关心界面,有利于合理的分工;
缺点:用户操作被抽象成一个Domain Event,会使结构变的复杂,很难被理解。
7. 感谢
感谢shaucle和BirdGu,他们提供了很多建设性的意见。