在Delphi中使用Action降低水平功能和業務功能的耦合

來源:互聯網
上載者:User
許可權和日誌管理是較為常見的水平功能,而且需求比較靈活,通常寫入程式碼到程式中。
本文將對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就像粘合劑將商務邏輯,許可權管理,日誌管理整合在一起。

引用至:http://blog.csdn.net/wqsmiling/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.