4

我正在开发一个遵循通用 MVC 设计的编辑器:模型保存数据,控制器知道如何更改它,视图问题调用控制器来查询和修改模型。为了论证,让我们使用

public class Model {
    public Object getStuff(String id);
    public void setStuff(String id, Object value);    
}    

public interface Controller {
    public void execute(Command command);
    public void redo();
    public void undo();     
    public void save();
    public void load(File f);
}

实际实现控制器的类持有对模型的引用;命令也需要访问它,因此它们都必须提供一个void execute(Model m);接口,仅在需要时才实际授予它们此访问权限。

然而,视图通常需要访问模型——在构建它们自己时,以及稍后监听更改并相应地刷新它们自己。恐怕在Controller中添加“Model getModel()”调用会导致绕过execute()机制的巨大诱惑;而且我不是唯一从事该项目的开发人员。鉴于这种情况,您将如何执行“所有更改都通过控制器”策略?

我正在考虑的两种选择:

  • 一个名为“ReadOnlyModel”的接口,由 getModel() 调用而不是真实模型返回,它会捕获任何此类尝试。
  • 大量评论提示即将到来的开发人员正确的做事方式
4

2 回答 2

1

我建议将模型的访问建模为一组类。例如,如果视图需要修改客户的属性,就会有一个 ModifyCustomerCommand 类,该类将具有执行更新所需的所有信息作为属性。视图将构造一个具有值的类的实例并将其传递回控制器,而控制器又会将命令传递回模型以进行实际更新。

这种方法的一个好处是这些模型访问命令中的每一个都可以实现撤消行为。如果控制器在将这些命令发送回模型时保持这些命令的有序集合,则控制器可以通过在最近执行的命令上调用 undo 方法来取消更改,一次一个。

于 2012-07-19T12:41:31.133 回答
0

如果您查看观察者模式http://en.wikipedia.org/wiki/Observer_pattern会怎样,您的视图只会监听来自模型的事件。希望能帮助到你。

于 2012-07-19T18:36:24.003 回答