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. 【bzoj3555】[Ctsc2014]企鹅QQ 简单哈希

    传送门 题目分析 题意即求有多少对字符串只相差一个字符,枚举删除每个字符后的哈希, 看有多少相等即可. 比如有如下字符串:$Sd123$,其中S部分的哈希值为H,删除的是d,则原字符串的哈希值为$$( ...

  2. dropzone上传文件

    先上张效果图吧 1.引入dropzone的js和css文件 2.html这里我用了一个form,当然你也可以直接用一个div,无论你用什么都要加上class="dropzone" ...

  3. Tomcat 学习总结

    1. 下载地址      Eclipse: http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/photo ...

  4. ASP.NET Core & Docker & Jenkins 零基础持续集成实战

    原文:ASP.NET Core & Docker & Jenkins 零基础持续集成实战 一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker ...

  5. Android Handler、Message完全解析,带你从源码的角度彻底理解

    之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了.惭愧!后面还会恢复进度,尽量保证每周都写吧.这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年 ...

  6. hdu4360 spfa+分割点

    标题要求必须按照L O V E 行走为了,你必须至少有一个完整的LOVE.说明可以通过同一个点反复 对每一个点拆分为4个点.分别为从L,O,V,E到达. 起始点看做是从E到达的 spfa时发现当前点距 ...

  7. [UWP]使用Writeable?Bitmap创建HSV色轮

    原文:[UWP]使用Writeable?Bitmap创建HSV色轮 1. HSV 1.1 HSV的定义 HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法,这种表示法试图做到比RGB基于笛卡尔 ...

  8. PBS 作业调度应用

    PBS(Portable Batch System),最初由 NASA 的 Ames 研究中心开发,主要为了提供一个能满足异构计算网络需要的软件包,用于灵活的批处理(Portable Batch Pr ...

  9. C++ Primer Plus的若干收获--(十一)

    本篇主要讲了转换函数的利与弊以及简要介绍流与iostream文件 因为在本篇仍然要使用上篇的Stonewt类,这里首先给出其代码 <span style="font-size:18px ...

  10. 移动浏览器Chrome 32 for Android移除300ms点击推迟

    在手机浏览器的一篇文章翻译300ms延迟实用文章,原文地址  http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away 去掉移动设 ...