当我第一次阅读
Christer Fahlgren’s comment on an answer on this question时,我感到很困惑,他声称在启动一个在表单上同时使用Delphi和WebBrowser组件的应用程序时,使用’MVC样式设计’会有好处,而使用CSS和JavaScript创建一个奇特的组合灵活的UI和动态更新视觉效果.
在我听到Ajax之前的一段时间里,我一直在Delphi中这样做,而且在我听到关于’MVC’的事情之前很多.
也许这是一个在这个问题上寻求帮助的好时机:使用MVC设计的代码是什么样的.
通过阅读工作源代码,然后阅读一些技术主题的文献,我总是更好地理解范式.原型教科书 – 由MVC模式设计的示例Delphi-WebBrowser-HTML-DOM修改应用程序是什么样的?
最佳答案 一个非常简单的演示应用程序,演示了一般原则:
TModel = class
property ValueList : TList <Double> read ... write ...;
end;
然后,您可以拥有多个可视化模型的视图,即一个显示表中值的视图和一个显示图中值的视图:
IView = interface ['{0D57624C-CDDE-458B-A36C-436AE465B477}']
public
procedure Update;
end;
TTableView = class (TInterfacedObject, IView)
private
FModel : TModel;
FController : TController;
public
procedure Update;
end;
TDiagramView = class (TInterfacedObject, IView)
private
FModel : TModel;
FController : TController;
public
procedure Update;
end;
视图仅从模型中读取数据.所有与GUI的交互都委托给控制器类(顺便使用Observer设计模式):
TController = class
private
FModel : TModel;
FViewList : TList <IView>;
private
procedure UpdateViews;
public
procedure AddDataValue (Value : Double);
end;
AddDataValue的实现可能如下所示:
procedure TController.AddDataValue (Value : Double);
begin
FModel.ValueList.Add (Value);
UpdateViews;
end;
procedure TController.UpdateViews;
var
View : IView;
begin
for View in FViewList do
View.Update;
end;
这样你可以实现多种目的:
>您可以轻松使用多个视图(允许用户切换视图之间或同时显示它们)
>所有数据都在模型中,并与演示文稿完全分开.更改表示,在模型中不进行任何更改.
>要实现持久性,您只需保存模型.
>您可以使用控制器执行所有必要的检查. (而不是为每个视图实现这个)
为了获得完整的优势列表,Web上充满了对MVC模式及其替代方案的讨论.
在Delphi应用程序中,由于Delphi中基于事件的编程风格,您可能会发现控制器是一种开销.我经常做的是只将我的应用程序拆分为模型和视图.