ERPSYSTEM开发教程05 框架接口管理

框架接口是采用类厂来管理的

一个接口要被框架管理的实现步骤

首先是接口定义,接口实现类,接口实例创建函数,指定类厂

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)

时间: 2024-10-14 10:49:48

ERPSYSTEM开发教程05 框架接口管理的相关文章

ERPSYSTEM开发教程04 框架模块管理

从DEMO程序获知, 框架主程序工程文件里Forms替换为uTangramFramework, 每个模块都有一个TModule子类和一个GetModuleClass导出函数 那么框架是如何进行模块管理的呢? 我们先从模块入手 unit DllOnePlugin; interface uses SysUtils,Classes,uTangramModule,SysModule,RegIntf; Type TUserModule=Class(TModule) private public Const

ERPSYSTEM开发教程01 框架介绍

从今天开始我将给大家带来一套有关Delphi开发的教程 主要开发ERP软件 我个人觉得,ERP软件的开发,技术层面的不是最大问题, 而是对客户需求的认知程度以及如何管理复杂多样的需求. 因此一个开发框架显得非常重要! 这里我推荐一套来自网络的开源框架 Tangram Plugin Framework 框架特点 1.采用模块化插件开发,支持DLL和BPL两种模块方式 2.自动或手动动态加载模块 3.模块与模块或主程序之间均使用统一的接口方式进行访问 源代码下载地址  http://code.goo

ERPSYSTEM开发教程02 框架安装

1.下载好Tangram后解压 2.把\framework目录下的DCP,Interfaces,Units添加到Delphi搜索目录 3.打开目录下的framework.groupproj项目工程组,该工程组有四个项目Tangram_Core.bpl ConfigTool.exe PackageRequries.exe IDEWiz.bpl 分别是框架核心包,框架配制工具,包引用查看工具,IDE向导.然后编译一下工程组,并把IDEWiz.bpl安装,这样就可以用向导来创建框架主程序或模块 框架源

ERPSYSTEM开发教程03 DEMO程序开发过程

DEMO程序说明 提供了两个演示接口 IBplOne=interface ['{E4C1C5FA-C598-4834-9111-26B52634068D}'] function Add(A,B:Integer):integer; function Sub(A,B:Integer):Integer; end; IDllOne=interface ['{0434DE04-07C9-4623-9009-CF7892768431}'] function GetString:string; procedu

java Vamei快速教程05 实施接口

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部细节,只提供给用户接口(interface). 接口是非常有用的概念,可以辅助我们的抽象思考.在现实生活中,当我们想起某个用具的时候,往往想到的是该用具的功能性接口.比如杯子,我们想到加水和喝水的可能性,高于想到杯子的材质和价格.也就是说,一定程度上,用具的接口等同于用具本身.内部细节则在思考过程中

06-移动端开发教程-fullpage框架

CSS3的新特性已经讲完了,接下来我们看一下jQuery的一个全屏jQuery全屏滚动插件fullPage.js.我们经常见到一些全屏的特绚丽页面,手指或者鼠标滑动一下就是一整屏切换,而且还有各种效果.比如:全屏滑动案例 下面我们就介绍一下jQuery的fullPage.js的如何使用及常用的配置. 1. fullpage.js的主要功能 fullPage.js是一个基于jquery的插件,它能很方便的制作出全屏网站,github地址. 主要功能有: 支持鼠标滚动. 支持前后退和键盘控制. 多个

Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明

上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作自定义菜单,以及其他的高级接口,这一篇单讲自定义菜单. 一.自定义菜单规则 自定义菜单分为一级菜单和二级菜单. 一级菜单数量为1-3个,即打开公众账号直接可以看到排列在最下方的最多3个按钮.一级菜单的文字最多不能超过16字节(相当于8个汉字). 二级菜单从属于一级菜单,数量为1-5个.二级菜单的文字不最多不能

蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的Framework包括Android Framework.Linux QT.Windows MFC.应用框架抽象并封装实现了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式供应用开发人员调用以完成具体的需求. 一般Framework完成的工作包括:任务分

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制 在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需要提供AccessToken,因此我们每次在调用高级接口之前,都需要执行一次获取AccessToken的方法,例如: 1 var accessToken = AccessTokenContainer.