Delphi MVC 模式 by Joanna Carter 译文:skyblue(转载请注明作者) 在一篇已经发表的文章中做了微小改动;可以从这篇文章中看到关于 Model View Presenter(模型-视图-推荐者)的概念更胜于 Model View Controller(模型-视图 -控制器)。“但是我还不知道什么是模型-视图-控制器!”,你可能会说。好, 在本文得最后篇章中我希望你得问题或者其他更多得
问题能够得到解答。 在最近得文章中,我已经讨论过 oo
设计模式,包括观察者模式,并且我猜想 MVC 可 能被当成一种超级观察者;但是我想最好把它描述成一种开发框架。 为了不使你有太多迷惑,我将忽略 MVC 中控制器的概念,并用 MVP 中的推介者作为 替代来描述;他们完成大多数相同的工作,不同的是推介者在 GUI 脚本中的操作有点 诡异。 让我们开始描述 MVP 的构成元素。 模型(Model) 模型在一个
系统中表示一个具体对象的数据和行为,例如,一个列表或者一个树。模 型将扮演驱动视图的角色。 视图(View) 视图是一种显示下层模型的可视方式。例如,TListView 或者 TTreeView。视图将扮演 模型的观察者角色。 选择(Selection) 模型维护一个可供选择的对象,这个对象可以反映当前视图中突出的条目。任何指令 发给模型处理都依赖这个选择对象。 指令(Command) 一个指令是模型上预知的每个行为。处理者和交互都要求模型处理指令。指令可以不 被处理或者重新被处理,从而为结构提供基础。指令通常作为观察者,在选择模式中 执行相同的操作于每个条目上。 处理者(Handler) 处理者用作获取简单的鼠标和菜单事件并对事件做出不需要在一个 GUI 组件上写入其 逻辑反映的一种方式。一个处理者保存一个相关指令的引用。
交互(Interactor) 一个交互被用作处理复杂的事件,例如拖放,和处理者一样,从任何一个 GUI 元素上 分离逻辑反映。一个交互通常从处理者派生 推荐者(Presenter) 推介者被依赖于: 管理来自于视图的输入表示 根据 GUI 选择对象刷新模型选择对象 激活和撤销处理者和交互 管理和执行指令 组件(Componet) 在一个窗体里每个可视控件通常以一种特殊格式呈现数据;然而这里有不止需要一个 在下层数据上的视图的地方。MVP 允许在一个单独组件里面同时有数据封装(model), 可视外观(View)和输入管理(Presenter)。这些组件能够聚合形成大的组件和应用程 序。 回到现实世界 讨论理论固然很好,但是在这个例子里面,我将创建一个简单但是完整的组件示范一 下这些组成部分怎样建立和协同
工作的。 我将描述的这个组件将基于字符串列表;在每个人大喊“难道这不是多余的?”之 前,我必须强调一点,
这是
学习实践的捷径而且我们需要从简单学起。 在我开始示范 MVP 之前,我需要为观察者模式定义一些接口: ISubject = interface; IObserver = interface ['{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'] procedure Update(Subject: ISubject); end; ISubject = interface ['{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'] procedure Attach(Observer: IObserver); procedure Detach(Observer: IObserver); procedure Notify; end; 你可能注意到观察者包含一个 update 方法;因为在 delphi 里面许多可视组件都包含一 个 update 方法不需要 ISubject 参数,我们需要做一些特别的组件用作视图。
模型 下一步,我们需要定义基于这个 mvp 组件的模型的行为:
IListModel = interface ['{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'] procedure BeginUpdate; procedure EndUpdate; function GetCount: Integer; function GetItem(Idx: Integer): string; procedure procedure procedure procedure procedure Add(Item: string); Clear; Insert(Item, Before: string); Move(Item, Before: string); Remove(Item: string);
property