IOC英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你。Ioc模式是解决调用者和被调用者之间关系的模式,可以有效降低软件的耦合度,并适合团队开发,使用这种模式需要首先设计一个好的框架,也可以称之为IoC容器(可能这样的说法在Java世界更Cool J)。其实Windows内部就存在这样的模式,称之为Callback(回调),在Delphi 的源代码中也有很多这样的方式。看一个例子:
       可以打开下面两个文件
       $(Delphi)\Source\Vcl\DB.pas
       $(Delphi)\Source\Vcl\DBLogDlg.pas
       第二个文件是一个需要用户填写登录用户名和密码的对话框,显然这属于用户交互层,
我们不希望在DB.pas(数据逻辑层)中直接调用这个功能,Delphi是这样实现的:
       DB.pas #2282 有这样的声明:
       LoginDialogProc: function (const ADatabaseName: string; var AUserName, APassword: string): Boolean;
       LoginDialogProc 被定义为函数类型变量。
       在DBLogDlg.pas #132
        initialization
              if not Assigned(LoginDialogProc) then LoginDialogProc := LoginDialog;
       也就是在DBLogDlg.pas单元初始化阶段给DB.Pas中的LoginDialogProc赋予实现函数。
我觉得这个例子已经足够把问题说得清楚了。
当然这并非实现IoC的唯一方法,对于不同的语言都有自己的特性,上面的方法可能比较古老的一种,通过函数指针来实现,其他的方法还有
       一:封装为接口
              我们看到在DB.pas 中声明了很多类似的函数变量,我们可以将其封装为一个接口
       IDBDlogInterface = Interface
  ['{06B5DEAC-0BB1-4658-91F6-E78004DF131D}']
  LoginDialogProc: function (const ADatabaseName: string; var AUserName, APassword: string): Boolean;
  LoginDialogExProc: function (const ADatabaseName: string; var AUserName, APassword: string; NameReadOnly: Boolean): Boolean;
  RemoteLoginDialogProc: function (var AUserName, APassword: string): Boolean;
end;
然后申明一个全局的接口类型变量
Var
       DBDialog : IDBDialogInterface ;
       然后在其他单元实现这个接口,并初始化时赋值到这个接口变量。
       二:注册机制的IoC
       这个例子稍微复杂一些,但是似乎更使用
       我们在一个窗口上放置了一个pageControl,我们知道一个pageControl上可以放置多个pageControl,而且这多个pageControl功能相对独立,没有耦合。我们可以这样做:建立这个主窗体放置一个空的PageControl,然后声明一个TInterfaceList变量用来存储PageControl的具体实现。每一个PageControl动态创建,使用注册的Frame来填充。代码如下:

unit frmStartPage;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,  StdCtrls, ImgList,Contnrs, ComCtrls, ExtCtrls;
 
Type
  //填充pageControl的Frame基类
  TPageFrame = class(TFrame)
  protected
    function Caption :String ; virtual; abstract;
  end;
      
  TPageFrameClass = class of TPageFrame ;
      
  TStartPage = class(TForm)
    PageControl1: TPageControl;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  StartPage :TStartPage ;
  RegTabSheetClasses: TClassList;
  procedure RegisterStartPageTabSheet( AFrameClass :TPageFrameClass);
 
implementation
 
{$R *.dfm}
 
 
procedure TStartPage.FormCreate(Sender: TObject);
var
  i:integer;
  lTabSheet : TTabSheet;
  lFrame : TPageFrame;
begin
  for i:= 0 to RegTabSheetClasses.Count -1 do
  begin
    lTabSheet := TTabSheet.Create(PageControl1);
    lFrame := TPageFrameClass( RegTabSheetClasses[i]).Create(self) as TPageFrame;
    lTabSheet.Caption := lFrame.Caption ;
    lFrame.Align := alClient;
    lTabSheet.InsertControl(lFrame);
    lTabSheet.PageControl := PageControl1;
    lTabSheet.PageIndex := 0 ;
  end;
end;
 
procedure RegisterStartPageTabSheet( AFrameClass :TPageFrameClass);
begin
  RegTabSheetClasses.Add(AFrameClass);
end;
 
initialization
  RegTabSheetClasses := TClassList.Create ;
finalization
  RegTabSheetClasses.Free;
end. 
       
 
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs,frmStartPage, StdCtrls;
 
type
  TFrame2 = class(TPageFrame)
    Label1: TLabel;
  private
    { Private declarations }
  protected
    { Public declarations }
    function Caption :String ; override;
  public
  end;
 
implementation
 
{$R *.dfm}
{ TFrame2 }
 
function TFrame2.Caption: String;
begin
  result := 'Frame1';
end;
 
initialization
  RegisterStartPageTabSheet(TFrame2);
 
end.

转至:http://tb.blog.csdn.net/

http://www.cnblogs.com/sonicit/archive/2008/04/08/1141831.html

Delphi下IOC 模式的实现(反转模式,即Callback模式)的更多相关文章

  1. [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  2. [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  3. Ioc 器管理的应用程序设计,前奏:容器属于哪里? 控制容器的反转和依赖注入模式

    Ioc 器管理的应用程序设计,前奏:容器属于哪里?   我将讨论一些我认为应该应用于“容器管理”应用程序设计的原则. 模式1:服务字典 字典或关联数组是我们在软件工程中学到的第一个构造. 很容易看到使 ...

  4. Elite Container DELPHI下的一个轻量级IoC对象容器

    一.简介: Elite Container是DELPHI下的一个轻量级IoC对象容器(IoC:Inverse of Control,反转控制).它是参考了Java中的Spring框架(主要是配置文件的 ...

  5. Java 控制反转和依赖注入模式【翻译】【整理】

    Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...

  6. 大端模式、小端模式和C#反转

    A.C#大端模式和小端模式. 小端(little-endian)模式:低地址上存放低字节,高地址上存放高字节. 如0x11223344→ byte[] numBytes = new byte[]{ 0 ...

  7. ASM:《X86汇编语言-从实模式到保护模式》越计卷:实模式下对DMA和Sound Blaster声卡的控制

    说实话越计卷作者用了16页(我还是删过的),来讲怎么控制声卡,其实真正归纳起来就那么几点. ★PART1:直接存储访问 1. 总线控制设备(bus master) 在硬件技术不发达的早期,处理器是最重 ...

  8. 深度分析Linux下双网卡绑定七种模式 多网卡的7种bond模式原理

    http://blog.csdn.net/abc_ii/article/details/9991845多网卡的7种bond模式原理 Linux网卡绑定mode共有七种(~) bond0.bond1.b ...

  9. windows下上传shell脚本不能运行—将dos模式修改为unix 文件格式

    windows下上传shell脚本至linux,其格式将为dos.dos模式的shell脚本将不能再linux下正确运行,需要修改文件模式为unix. 1 查看文件模式方法 linux服务器上,用vi ...

随机推荐

  1. 亲测有效,解决Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/hjf161105/article/details/78850658 最近租了一个阿里云云翼服务器,趁 ...

  2. C++动态数组简单的模拟二元堆

    //C++动态数组简单的模拟二元堆 #include<iostream> using namespace std; class BinaryHeap { private: int cap; ...

  3. 深度剖析:最新云端开发工具如何实现敏捷+DevOps开发落地

    相信很多软件开发人员们对今年国内新兴的云端开发工具——华为软件开发云都有耳闻,有些人可能还免费体验过,由于它5人以下的团队是免费使用的,很庆幸本人的这个项目正好5个人,就注册使用了.下面就自己的使用心 ...

  4. C#性能优化:延迟初始化Lazy

    1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延迟初始化出现于.NET 4.0,主要用于 ...

  5. spring sts4 如何添加tomcat 服务

    spring sts4 ide中已经没有集成tomcat运行服务器了,需要到点击Help-->Eclipse Marketplace中安装 Eclipse JST Server Adapters ...

  6. 关于CORS跨域更细节的思考

    权威的资料看MDN,也可以看阮一峰的文章.不过感觉阮一峰对于CORS的描述有问题,简单请求被阮一峰描述为2次浏览器请求了.这个要自己搭个服务器试一下.跨域基本都是根据域名判断的,自己是否要再买个域名呢 ...

  7. jquery 源码学习(二)

    在网上找到一篇广为流传的文章<常用正则表达式>,逐一分析,不足地方进行补充和纠正   作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail ...

  8. ActiveReports 报告应用程序教程 (2)---上市类报告

     大多数数字在报告中系统类报告列表.实例:客户名单.产品列表.设备清单.采购清单.优惠券.商品发票.工作人员清点等..根据报告,查看类别列表相对简单.但,分丰富,在清单类报表中能够增加数据统计.数 ...

  9. TCP/IP协议族(一)

    TCP/IP协议族(一) HTTP简介.请求方法与响应状态码 接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的. ...

  10. 嵌套函数中的this

    function countDown(){ var self = this; var doWork = function(){ console.log(this);//window console.l ...