一.问题 【程序编程相关:用Delphi编写自己的可视化控件 】
[mental studio]猛禽[blog] 【推荐阅读:保存页面为MHT的代码 】
假设有一个ifoo接口: 【扩展信息:COM 中的服务器和对象(翻译) 】
所谓动态代理(dynamic proxy),要先从gof的proxy模式说起.
{$m+} ifoo = interface( iinterface ) [{3a85e46d-f3d4-4d9c-a06c-4e7c1bac9361}] function dosth( dummy : integer ) : string; stdcall; procedure bar; stdcall; end; {$m-}接口提供者对其作了实现,并提供了一个工厂方法(factory method)来向用户提供了实例的创建,如下:
tfooimpl = class(tinterfacedobject, ifoo) protected function dosth( dummy : integer ) : string; stdcall; procedure bar; stdcall; end; (* tfooimpl的实现代码,略 *) // 创建实例的工厂方法 function getfooobject( ) : ifoo; begin result := tfooimpl.create as ifoo; end;作为这个接口的用户,只有ifoo接口的定义,并且可以一个创建的实现ifoo接口的实例,但没有实现类tfooimpl的定义与实现代码.如果现在用户需要为ifoo.dosth增加事务功能(假设dosth被实现为对数据库作更新操作),要怎么办?
二.静态代理解决方案
gof的proxy模式就是解决方案之一:
如图所示,首先要定义一个新的ifoo接口实现--tstaticproxy.其中用了一个属性fimpl记录了tfooimpl的实例.然后在 tstaticproxy中实现dosth与bar,并且将不需要变更的bar函数直接委托给fimpl处理,而在dosth的实现里加入事务处理即可. tstaticproxy的代码大致如下:
tstaticproxy = class(tinterfacedobject, ifoo) private fimpl : ifoo; protected function dosth( dummy : integer ) : string; stdcall; procedure bar; stdcall; public ... 下一页