1. 目的
从Presenter 中分离出数据加载和响应Domain 层异步事件的逻辑,使Presenter 的逻辑处理更加简单。关于Presneter 的介绍可以参见Martin Fowler 的MVP 模式(最近好像已经分解成Supervising Controller和Passive View 两个模式,我还怎么看懂)。
2. 适用性
该模式主要适用于多客户端需要数据同步的系统中。
3. 结构
说明:
1) Model:该模型Swing 中的Model 类似,负责提供数据,一般在实现时,这个Model 应该是Domain 层的相关接口,如果用Java 的RMI 实现,它一般是一个远程接口。
2) View:就是一般View,负责展现数据和响应用户操作,和其它模式中的View 一样。
3) DataBinder:它是该模式的核心,负责从Model 中查询数据,将查询出的数据更新到View;并且负责监听Doamin 层中数据的变化,实时更新到View 中。
4) Rule:它封装了数据的规则。
5) DataChangedListener:它就不用介绍了,就是一般的监听器。
4. 协作
由Action 调用DataBinder 的bind 方法,产生下图的执行流程。
由Domain 层的异步事件驱动,产生下图的执行流程:
5. 实现
DataBinder 的代码:
- public class DataBinder implements DataChangedListener {
- private View view;
- private Rule rule;
- public DataBinder(View view) {
- this.view = view;
- }
- public void bind(Rule rule, Model model) {
- Object[] objects = model.getObjects(rule);
- view.setObjects(objects);
- this.rule = rule;
- model.addDataChangedListener(this);
- }
- public void detach(Model model) {
- model.removeDataChangedListener(this);
- }
- public void onObjectCreated(Object newObject) {
- if (rule.matches(newObject)) {
- // Notify view.
- }
- }
- public void onObjectModified(Object oldObject, Object newObject) {
- if (rule.matches(oldObject) && rule.matches(newObject)) {
- // Notify view.
- }
- }
- public void onObjectDeleted(Object object) {
- if (rule.matches(object)) {
- // Notify view.
- }
- }
- }