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. 每天一个JavaScript实例-铺货鼠标点击位置并将元素移动到该位置

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. 【bzoj2453】维护队列 (分块 + 二分)

    传送门(权限题) 题目分析 题意为:求区间内有多少种不同的数,带修改. 首先对原序列分块,用last[i]表示与i相同的上一个在哪里,然后将分块后的数组每个块内的按照last进行排序,这样查询时就可以 ...

  3. matlab 高级函数 —— colfilt/blockproc (图像)矩阵的分块处理

    colfilt 执行功能与 blockproc/nlfilter 类似,但效率更高. B = colfilt(A,[m n],block_type,fun),block_type:distinct/s ...

  4. DDD实战6 单元测试

    1.在Products解决方案文件夹下面新建一个项目 一个单元测试项目 Product.Tests.

  5. P和P1指向了O和O1两个变量(对象)的地址, 而不是O和O1的内容(对象的实际地址)——充分证明@是取变量(对象)的地址,而不是变量里面的内容,够清楚!

    如图,为什么这样取出来的p,p1的值不一样呢?   165232328群友庾伟洪告诉我:  P和P1指向了O和O1两个变量(对象)的地址, 而不是O和O1的内容(对象的实际地址) ,你想P指向真正的对 ...

  6. latex 常用环境(environment)

    align \begin{align} \overline{A \cup B} &= \overline{A} \cap \overline{B}, \\ \overline{A \cap B ...

  7. wpf 自定义窗口,最大化时覆盖任务栏解决方案

    原文:wpf 自定义窗口,最大化时覆盖任务栏解决方案 相信很多人使用wpf时会选择自定义美观的窗口,因此会设置WindowStyle="None" 取消自带的标题栏.但这样使用 W ...

  8. PYC文件简介

    PYC文件简介¶ 不说废话,这里说的pyc文件就是 Python 程序编译后得到的字节码文件 (py->pyc). 基本格式¶ pyc文件一般由3个部分组成: 最开始4个字节是一个Maigc i ...

  9. python下载图片(3)

    # -*- coding: utf-8 -*-"""some function by metaphy,2007-04-03,copyleftversion 0.2&quo ...

  10. C ++ 17 技术上已经完成,C ++ 20 也在路上(有路线图)

    在前不久结束的冬季 ISO C ++标准会议(Kona)上,C ++ 17 宣布在技术上已完成,仅剩下一些 ISO 相关的繁文缛节,即将提交至最终的 ISO 投票表决.该会议由 Plum Hall 和 ...