在Java模型 - 视图 - 控制器设计中访问模型

时间:2012-07-19 12:31:58

标签: java model-view-controller design-patterns

我正在按照一般的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()调用而不是真实模型返回,捕获任何此类尝试。
  • 很多评论都是为了向传入的开发人员提供正确的做事方式

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果您查看观察者模式http://en.wikipedia.org/wiki/Observer_pattern,您的视图只会侦听来自模型的事件。 希望它有所帮助。