浅谈HMVC模式续----例子讲解
HMVC模式例子
功能实现:此应用程序实现Window Form下的模板定制,通过设计时环境定制好模板,将模板信息保存到数据库,便于以后进行模板和内容输出。本篇关注的是HMVC模式在此应用程序中的应用,具体的业务逻辑不属于本篇范围。
最后实现的应用程序的界面如下图:
描述:此界面很类似VS.NET环境,是仿VS.NET,提取它的部分功能,并扩展而完成。
模块划分:应用程序模块主要有:菜单、工具箱、主工作区、模板树、数据源树、属性窗格。根据功能模块分别实现不同的MVC结构。
HMVC设计:权衡此程序的复杂程度,采用2层HMVC结构。父MVC即框架MVC,它对应整个应用程序框架。子MVC分别有菜单MVC、工具箱MVC、主工作区MVC、模板树MVC、数据源树MVC、属性窗格MVC。
注:不要机械化的实现每一个MVC,MVC中的C(Controlller)是必须的,M(Model)和V(View)是可选的。如果一个MVC模块没有界面显示,不需要View;如果模块没有业务逻辑,也不需要M(在本例子中,工具箱就不需要M,它只负责显示)。
代码片断:
首先定义接口GuiModel:
{
void Init();
void SetView(View.GuiView view);
void HandleAppEvent(AppEvent ae);
View.GuiView GetView();
}
再定义接口GuiView:
{
Void BuildDisplay();
void SetController(GuiController con);
object GetController();
void SetModel(GuiModel model);
void Init();
void HandleAppEvent(AppEvent ae);
}
首先实现一个控制器基类GuiController:
{
protected GuiModel m_model;
protected GuiView m_view;
public GuiController()
{
}
public GuiController(GuiModel model , GuiView view)
{
m_model = model;
m_view = view;
}
virtual public void Init()
{
}
virtual public void SetChildController(GuiController child)
{
}
virtual public void SetParentController(GuiController parent)
{
}
virtual public GuiController GetParentController()
{
return null;
}
virtual public void HandleAppEvent(AppEvent appevent)
{
}
}
父控制器—FrameController,子控制器菜单MenuController、工具箱ToolBoxController、主工作区WorkBenchController、模板树TemplateTreeController、数据源树DataSourceTreeController、属性窗格PropertyController 都继承自GuiController。它们分别实现Init(初始化操作),SetChildController(设置子控制器的关联关系),SetParentController(设置父控制器关联关系),GetParentController(得到父控制器的关联关系)和HandleAppEvent(处理事件)。
父控制器FrameController的实现中,在初始化过程中(Init)你需要至少做三件事。第一:设置FrameController和其他子控制器的父子关系(通过SetChildController,SetParentController等方法);第二:调用子控制器的初始化;第三:设置FrameController和FrameModel,FrameView的关联关系。而HandlerAppEvent则处理控制器之间的事件流转。
其他子控制器的初始化实现中,只需要设置自己的MVC结构的Model,View和Controller的关联关系。
Model和View的实现:
所有MVC结构的Model,View分别继承GuiModel和GuiView接口。Model关键要实现HandlerAppEvent,而View关键是实现BuildDisplay(显示界面)和HandlerAppEvent。
举个主工作区的MVC例子:WorkBenchModel处理的事件主要有:保存定制好的模板(数据库操作)、复制或粘贴模板(剪贴板和内存中存储控件操作)等。而WorkBenchView主要是显示界面,也许也会有一些事件处理的操作。
这样,整个HMVC结构就生成了。由于编码和写作水平有限,可能里面有很多没讲清楚的地方,请大家指出来一起讨论。