我正在开发一个遵循通用 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() 调用而不是真实模型返回,它会捕获任何此类尝试。
- 大量评论提示即将到来的开发人员正确的做事方式