设计给了我们对软件更清晰的认识,3年后的今天,算是远远的看到了软件设计的大门.用周xx的话来说,这个世界前所未有的清晰..
这样的设计为什么能够说有扩展性呢?,
整个系统靠IMisDriver驱动起来,它使用接口来完成工作,每一个接口,你可以使用不同的方法来实现,并发布它(bpl形式),就像你从pc上拔掉了一个优盘,插上了另一个优盘,你就可以看到故事的后半部分.
再举个实际的例子:你原先的权限验证需要去掉,现在不再需要权限,那么你可以实现一个总返回"允许操作"的IAuthentic,发布出去,系统的执行行为整个就改变了.
这导致的结果是:IMisDriver说我需要哪些接口,你只要提供了相应数量和类型的接口,他就可以按照预先设定的调度来完成整个系统.
那么如果整个系统的调度需要变化怎么办呢?这在软件设计中简直就是灾难,但是在这样的插件系统下,你只需要修改IMisDriver,或者重新设计一个IDriver来驱动其他的接口,这样的改变已经最大可能的保证了软件的价值.
如何规划好你的系统,这将是日后软件复用,重构的重要因素,
理论不知道说的够清楚没有,之后的工作,将是枯燥的代码编写了,
总结一下,
1.面向接口,提供给插件式系统中插件开发成为可能.
2.bpl机制,很大程度上把我们从把插件本地化的工作中逃离,它的机制在delphi中特有,基于delphi我们能做的可能只有通过它来的最方便了
3.系统的设计对于哪怕是一个简单的系统来说,能更好的帮助你对产品有着更全面的思想.一定要做,那怕只是花两个圆呢.^_^
(水平有限,说不定错误百出,大家注意大牙别掉了,谢谢)
在这样的构想下,我们来做一个demos,
我们来定义如下的被IMisDriver驱动的接口,加入现在能想到的简单的应用,我们要作的工作如下
定义被驱动的接口
撰写IMisDriver的一个实现,用它来驱动各个接口,IMisDriver通过调用TPluginLoader的获得接口实例.
撰写每个接口的实现,并生成多个bpl
用TPluginLoader来载入这些插件,
主程序,实例化一个TPluginLoader,然后取得IMisLoader的实例,运行它.
我们先来完成第一步
unit InterfaceDefine;
interface
uses DBClient, midasLib, Types, classes;
type
ITracer = interface
[''{623B3A22-15CE-4555-B470-C3F4EBEE7EB4}'']
procedure info( const msg: string );
procedure error( const msg: string );
procedure debug( const msg: string );
end;
ILogin = interface
[''{082F9C02-B504-4417-ACEB-1C9E3410ADED}'']
procedure login( const user, pwd: string );
function loginByCookie( const user, pwd: string ): string;
end;
IUserInfo = interface
[''{4DE53541-6FC3-44C7-BA27-49B0827625F0}'']
function information: TObject;
end;
IAuthentic = interface
[''{0E4BCF53-D685-4AC8-9C38-614117E59365}'']
procedure valid( const actionId: string );
procedure config;
end;
IDataService = in