中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
在Delphi中使用Action降低水平功能和业务功能的耦合
作者:未知 时间:2005-07-27 22:02 出处:CSDN 责编:chinaitpower
              摘要:在Delphi中使用Action降低水平功能和业务功能的耦合

权限和日志管理是较为常见的水平功能,而且需求比较灵活,通常硬编码到程序中。
本文将对Delphi中的Action进行扩充实现将权限和日志管理功能从主程序中分离。
1.  
常见的方法是将权限管理和日志管理直接硬编码到过程或者对象的方法中。
例如:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if isSuperUser(UserName) then
  begin
    Close;
    addLog(UserName,'Close');
  end
  else
    showMessage('You have not this right');
end;
上面的代码将权限管理和日志管理硬编码到程序中,不利于程序的重用和扩展。
2.  
下面是扩展的一个Action类Form1CloseAction,它封装了Close方法
  TForm1CloseAction = class(TAction)
  private
    FOprName: string;
    FUserName: string;
    FForm: TForm1;
    procedure SetForm(const Value: TForm1);
    procedure SetOprName(const Value: string);
    procedure SetUserName(const Value: string);
  public
    function Execute: Boolean; override;
    constructor Create(AOwner:TComponent); override ;
  published
    property UserName:string read FUserName write SetUserName;
    property OprName:string read FOprName write SetOprName;
    property Form:TForm1 read FForm write SetForm;
  end;
在Execute方法中完成用户的逻辑业务,这样可以很好的将应用程序的水平功能和垂直功能相分离。
function TForm1CloseAction.Execute: Boolean;
begin
  result:=  inherited Execute;
  if haveRight(UserName,OprName ) then
  begin
    Form.Close;
    addLog(UserName,'Close');
  end
  else begin
    showMessage('you have not this right');
  end;
end;
注意到Form1CloseActiony有一个Form属性作为业务逻辑对象,所以在调用Execute前要初始化 Form属性。
这样我们只要动态创建一个 TForm1CloseAction对象CloseAction 并指定Button1.Action:=CloseAction。

3.  很明显通常一个业务逻辑对象有很多方法,如果按照上一步封装为Action的话,有很多重复编码。于是我们在TForm1CloseAction 和 Tacton之间插入一个类,并为这个类引入一个新的方法InternalExecute来封装用户的业务逻辑方法,使用Execute来完成水平功能。
  TForm1Action = class(TAction)
  private
    FOprName: string;
    FUserName: string;
    FForm: TForm1;
    procedure SetForm1(const Value: TForm1);
    procedure SetOprName(const Value: string);
    procedure SetUserName(const Value: string);
  protected
    procedure InternalExecute; virtual; abstract;
  public
    function Execute: Boolean; override;
    constructor Create(AOwner:TComponent) ;override ;
  published
    property UserName:string read FUserName write SetUserName;
    property OprName:string read FOprName write SetOprName;
    property Form:TForm1 read FForm write SetForm1;
  end;
关键的方法Execute如下实现
function TForm1Action.Execute: Boolean;
begin
  result:= inherited Execute;
  if haveRight(UserName,OprName) then
  begin
    self.InternalExecute;
  end
  else begin
    showMessage('you have not this right ');
  end;
  addLog(UserName,'Close');

end;

这样原来的TForm1CloseAction 改为
  TForm1CloseAction = class(TForm1Action)
  protectec
    procedure InternalExecute ; override ;
  public
    constructor Create(AOwner:TComponent) ;override ;
  end;

  为简便起见我使用Form来表示业务逻辑对象,而实际的业务逻辑对象最好是于界面无关的,上述方法可以看作是MVC的子模式或实现。上面的模型还有很多可以扩展的方面,例如:将HaveRight,AddLog方法分别由权限管理类和日志管理类来实现权限信息和日志信息的持久化。这样Action就像粘合剂将业务逻辑,权限管理,日志管理整合在一起。



关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有