程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> ERPSYSTEM開發教程05 框架接口管理,erpsystem05

ERPSYSTEM開發教程05 框架接口管理,erpsystem05

編輯:Delphi

ERPSYSTEM開發教程05 框架接口管理,erpsystem05


框架接口是采用類廠來管理的

一個接口要被框架管理的實現步驟

首先是接口定義,接口實現類,接口實例創建函數,指定類廠

unit BplOneIntf;
{$WEAKPACKAGEUNIT ON}

interface

type
  IBplOne=interface
    ['{E4C1C5FA-C598-4834-9111-26B52634068D}']
    function Add(A,B:Integer):integer;
    function Sub(A,B:Integer):Integer;
  end;

implementation

end.

這是接口的定義文件,如果一個接口是可以提供給其它模塊調用的話,那麼就放到一個公共目錄,並加入Delphi搜索路徑,方便調用

unit BplOneObj;

interface

uses sysUtils,Classes,SysFactory,BplOneIntf;//記得這裡引用你的接口單元

Type
  TBplOne=Class(TInterfacedObject,IBplOne)//假設你的接口叫IXXX(以下同)
  private
  protected
  {IXXX}
    //這裡加上你接口方法,然後按Ctrl+Shift+C,實現你的接口...
    function Add(A,B:Integer):integer;
    function Sub(A,B:Integer):Integer;
  Public
  End;

implementation

procedure Create_BplOne(out anInstance: IInterface);
begin
  anInstance:=TBplOne.Create;
end;
{ TBplOne }

function TBplOne.Add(A, B: Integer): integer;
begin
  result:=A+B;
end;

function TBplOne.Sub(A, B: Integer): Integer;
begin
  result:=A-B;
end;

var Factory:TObject;
initialization
  Factory:=TIntfFactory.Create(IBplOne,@Create_BplOne);
finalization
  Factory.Free;
end.

這裡分別是接口的實現類TBplOne,接口實例創建函數Create_BplOne(out anInstance: IInterface);以及接口工廠TIntfFactory的創建

框架提供了三種類廠TIntfFactory接口工廠,TSingletonFactory單實例工廠,TObjFactory實例工廠

其中TIntfFactory接口工廠,是在接口調用時,通過接口實例創建函數來創建實例對象

TSingletonFactory單實例工廠則是在第一次接口調用時通過接口實例創建函數來創建實例對象並保存該對象,再次調用時則返回先前創建的對象

TObjFactory實例工廠則是將一個已經創建好的對象與接口綁定,當調用接口時則返回該對象

單實例工廠與實例工廠都是只有一個實例對象,不同的是,單實例工廠是在第一次調用時創建對象,而實例工廠的實例則是預先創建好的

以接口工廠TIntfFactory為例,了解一下類廠是如何管理的

 

constructor TIntfFactory.Create(IID: TGUID; IntfCreatorFunc:TIntfCreatorFunc);
begin
  Flag:=0;
  self.FIntfCreatorFunc:=IntfCreatorFunc;
  Inherited Create(IID);
end;

constructor TBaseFactory.Create(const IID: TGUID);
begin
  if FactoryManager.Exists(IID) then
    Raise Exception.CreateFmt(Err_IntfExists,[GUIDToString(IID)]);

  FIntfGUID:=IID;
  FactoryManager.RegisterFactory(Self);
end;

procedure TSysFactoryManager.RegisterFactory(aIntfFactory: TFactory);
var i:Integer;
    IIDStr:String;
    IID:TGUID;
begin
  FSysFactoryList.Add(aIntfFactory);

  for i := FKeyList.Count - 1 downto 0 do
  begin
    IIDStr:=FKeyList[i];
    IID   :=StringToGUID(IIDStr);
    if aIntfFactory.Supports(IID) then
    begin
      FIndexList.Add(IIDStr,Pointer(aIntfFactory));
      FKeyList.Delete(i);
    end;
  end;
end;

 

TIntfFactory是TBaseFactory的子類,首先是保存了接口實例創建函數的地址,然後調用基類構造函數,

FactoryManager是一個全局函數,返回的是一個TSysFactoryManager類對象,該類是類廠的管理類,

先判斷是否存在該接口的工廠對象,如果不存在則對接口進行注冊,注冊的步驟就是將接口工廠添加到工廠列表

這樣就實現了接口類廠的注冊。

那麼統一的接口調用又是如何實現的呢?

統一接口調用 SysService as IXXX

function SysService:IInterface;
begin
  if not Assigned(FSysService) then
    FSysService:=TSysService.Create;
    
  Result:=FSysService;
end;

SysService是一個全局函數,返回的是一個接口IInterface,由TSysService構造的對象

Type
  TSysService=Class(TObject,IInterface)
  private
    FRefCount: Integer;
  protected
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  public

  end;

function TSysService.QueryInterface(const IID: TGUID; out Obj): HResult;
var aFactory:TFactory;
begin
  Result:=E_NOINTERFACE;
  if self.GetInterface(IID,Obj) then
    Result:=S_OK
  else begin
    aFactory:=FactoryManager.FindFactory(IID);
    if Assigned(aFactory) then
    begin
      aFactory.CreateInstance(IID,Obj);
      Result:=S_OK;
    end;
  end;
end;

而TSysService重新實現了IInterface接口,當一個接口進行as操作的時候,就會調用QueryInterface進行接口查詢

所以SysService as IXXX就會調用接口查詢QueryInterface,

而接口查詢函數首先是通過全局函數FactoryManager返回的TSysFactoryManager類對象,查找是否有該接口的類廠

如果存在該類廠則取出,並通過類廠創建實例返回。

以上就是框架的接口管理。

 

 

視頻教程地址:

ERPSYSTEM開發教程01     http://pan.baidu.com/s/1kT7Rb3D

ERPSYSTEM開發教程02     http://pan.baidu.com/s/11xN5s

框架源代碼下載地址            http://pan.baidu.com/s/1jGIc2Su

DEMO源代碼下載地址         http://pan.baidu.com/s/1bnyEafH

聯系QQ:1330009208 (驗證信息請填ERPSYSTEM)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved