我们可以想像这样一个系统,与mvc的思想比较相同,controller负责整个系统的调度,当用户执行了某个action后,controller将 其处理后用某个特定的view来呈现给用结果.这就是mvc
先看看这个图
这图是我用Together6.1画的,关心的设计思 想,而不是代码本省,而且together本身也不支持pascal语法生成(不知道有没有插件)
其中的IMisDriver就是mvc中 的TController,它负责协调整个系统,驱动系统工作起来.在delphi中它就是一个全局变量,任何单元都可以包含它,并访问它的功能,在 IMisDriver内部,将会用到我们上一章说到的TPluginLoader来持有所有的服务接口
下面解释一下各个接口的作用,
ITracer, 这是一个用来写入跟踪信息的接口,它仿照了一些log4j的思想.
ILogin,它用于登录的到系统,至于它后台使用的机制,当然要靠我们 的实现来进行验证
IUserInfo:它返回当前登录用户的各种信息,
IAuthentic用于验证当前用户是否具有某个操 作的权限.
IDataService用于提供数据服务,它可以从数据库中取得数据,并支持事务,
IShortcutDispather 它用于将用户的快捷输入转化为某个操作
IActionManager用于管理用户动作和该动作应采用的处理数据的类的对应关系,
IProcessData 用于处理给定的数据.
我们还可以看到IView和IReport从IProcessData继承下来,他们同样用来处理数据,只不过
IVew 用于给用户呈现数据的crud界面
IReport用于给用户呈现报表
继承自IView的几个接口,用于对同一数据呈现不同的 操作界面,我在另一个项目FormLib中基本实现了这些功能.
那么mvc的的通常操作的流程是什么样子呢?
上图没有包含一些全局的操作,例如ITracer等.
设 计给了我们对软件更清晰的认识,3年后的今天,算是远远的看到了软件设计的大门.用周xx的话来说,这个世界前所未有的清晰.....
这样 的设计为什么能够说有扩展性呢?,
整个系统靠IMisDriver驱动起来,它使用接口来完成工作,每一个接口,你可以使用不同的方法来实 现,并发布它(bpl形式),就像你从pc上拔掉了一个优盘,插上了另一个优盘,你就可以看到故事的后半部分.
再举个实际的例子:你原先的 权限验证需要去掉,现在不再需要权限,那么你可以实现一个总返回"允许操作"的IAuthentic,发布出去,系统的执行行为整个就改变了.
这 导致的结果是:IMisDriver说我需要哪些接口,你只要提供了相应数量和类型的接口,他就可以按照预先设定的调度来完成整个系统.
那 么如果整个系统的调度需要变化怎么办呢?这在软件设计中简直就是灾难,但是在这样的插件系统下,你只需要修改IMisDriver,或者重新设计一个 IDriver来驱动其他的接口,这样的改变已经最大可能的保证了软件的价值.
如何规划好你的系统,这将是日后软件复用,重构的重要因素,
理 论不知道说的够清楚没有,之后的工作,将是枯燥的代码编写了,
总结一下,
1.面向接口,提供给插件式系统中插件开发成为可 能.
2.bpl机制,很大程度上把我们从把插件本地化的工作中逃离,它的机制在delphi中特有,基于delphi我们能做的可能只有通 过它来的最方便了
3.系统的设计对于哪怕是一个简单的系统来说,能更好的帮助你对产品有着更全面的思想.一定要做,那怕只是花两个圆 呢.^_^