許可權和日誌管理是較為常見的水平功能,而且需求比較靈活,通常寫入程式碼到程式中。
本文將對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/