Delphi中的Wrapper设计模式

Wrapper设计模式能够把一个类的接口修改成另一个类所需要的接口,然后让本来因为接口不兼容的类能够在一起配合工作。

在 Delphi中,为了让两个类能够支持同样的接口,它们必须有同样的祖先类这样才能在其他类调用的时候实现多态性。但是有的时候我们希望两个没有关系的类 能够在一起工作,Wrapper设计模式就能够让一个类wrap部分另一个类的部分接口(当然也可以是全部,看具体的需要而定),从而能够模拟出一个类似 于“uses”的类的多继承关系。

让我们来看一个例子,有一个类TSimple从TObject继承下来,但是我们希望能把 TSimple这个类放到Delphi的控件面板(component palette)上,然而我们知道,如果一个类能够放置到控件面板上,这个类必须从TComponent派生下来。现在我们不想在改变TSimple的祖 先类TObject的情况下(比如我们并没有TSimple的源代码)把TSimple放到控件面板上,我们可以构建一个继承自TComponent的 TSimpleWapper类,在TSimpleWapper类中Wrap TSimple的接口。下面是这个例子的范例代码:

type
 TSample = class (TObject)
private
 FSomeValue: Integer;
public
 function SomeAction(const Data: string): Boolean;
  property SomeValue: Integer read FSomeValue write FSomeValue;
 end;
 TSampleWrapper = class(TComponent)
private
 FSample: TSample;
public
 property Sample: TSample read FSample;
end;

然后我们就可以在TSample类中实现TSample的接口了,代码如下:

TSampleWrapper = class (TComponent)
private
FSample: TSample;
protected
function GetSomeValue: Integer;
procedure SetSomeValue(Value: Integer);
public
function SomeAction(const Data: string): Boolean;
property Sample: TSample read FSample;
property SomeValue: Integer read GetSomeValue write SetSomeValue;

接口实现代码如下:

function TSampleWrapper.GetSomeValue: Integer;
begin
Result := Sample.SomeValue;
end;
procedure TSampleWrapper.SetSomeValue(Value: Integer);
begin
Sample.SomeValue := Value;
end;
function TSampleWrapper.SomeAction(const Data: string): Boolean;
begin
Result := Sample.SomeAction(Data);
end;

时间: 2024-08-24 07:02:25

Delphi中的Wrapper设计模式的相关文章

delphi中对象create之后,默认存放的路劲是?

问题描述 delphi中对象create之后,默认存放的路劲是? 例如:Tinifile,Tbitmap,等等,不带路劲名,直接create('文件名.ini'), 怎么判断是否创建成功,是不是只有提前判断同名文件是否存在一种方法? 解决方案 在D中每个应用程序可以获得的内存空间分为两种:堆(heap)和栈(stack). 堆又称为"自由存储区",其中的内存空间的分配与释放是必须由程序员来控制的.例如,用GetMem函数获取了一定大小的内存空间,则在使用完后,必须调用FreeMem函数

Delphi中取得系统支持的颜色数的方法

在自己的软件中经常需要得知运行本软件的系统支持的颜色数.例如有的软件在16Bits的颜色数的计算机上开发而成,程序的颜色调试得非常漂亮,但是到了一台只支持16色的计算机上,程序变得非常难看.这就需要得到系统的颜色数. Delphi中如何取得系统的颜色数呢?下面的程序就解决这个问题. function GetSysColorNum:Integer; Var ScreenDc:HDC; NumBitsPixel:Integer; begin Result:=0; ScreenDc:=GetDC(0)

Delphi中TApplication类的用法

在Delphi中TApplication是一个有着十分重要作用的类.TApplication类是用于描述Delphi编制的应用程序的一个类.通过对这个类的灵活应用可以编制许多有特点的程序.. 1) 检测当前Windows程序是否被激活: TApplication类有一个属性--Active,这个属性就可以描述当前运行的程序是否被激活,成为Windows的焦点.检 测的代码如下: If Application.Active=False then ShowMessage('当前窗口没有被激活');

Delphi中利用钩子实现QQ聊天窗口的修改

有人曾为公司不让用QQ.MSN等聊天工具而烦恼吗?看了下面的小程序你就会打消这种看法了. 当初公司做校园一卡通的项目时,里面的机房客户端需要用到系统的低级键盘钩子WH_KEYBOARD_LL,这也是我第一次接触到Windows中的Hook,因为WH_KEYBOARD_LL和其他钩子不一样,在Delphi的Windows帮助以及windows.pas文件中都没有定义,但microsoft的msdn中确有WH_KEYBOARD_LL的介绍,所以一路解决后就对Windows的系统钩子产生了兴趣.之后相

Delphi中如何取得系统支持的颜色数

在自己的软件中经常需要得知运行本软件的系统支持的颜色数.例如有的软件在16Bits的颜色数的计算机上开发而成,程序的颜色调试得非常漂亮,但是到了一台只支持16色的计算机上,程序变得非常难看.这就需要得到系统的颜色数. Delphi中如何取得系统的颜色数呢?下面的程序就解决这个问题. function GetSysColorNum:Integer; Var ScreenDc:HDC; NumBitsPixel:Integer; begin Result:=0; ScreenDc:=GetDC(0)

Delphi中的消息处理

1.windows的消息驱动体系 在windows系统中,消息传递是实现对乡间通信和控制的主要手段.可以额系统都以消息驱动的方式工作.系统中发生的用户输入操作.显示信息的改变.系统环境参数变化等所有时间都以系统定义消息的形式出现在相关的应用程序和窗口.所以程序设计的主要任务就是为这些消息的处理设计代码. 在应用程序中,发送者可以通过发送消息要求接收者完成相应的处理.当程序运行时,windows系统为每个应用程序实例建立一个消息队列,一次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置一

初探Delphi中的插件编程

前言 我写Delphi程序是从MIS系统入门的,开始尝试子系统划分的时候采用的是MDI窗体的结构.随着系统功能的扩充,不断有新的子系统加入系统中,单个工程会变得非常大,每次做一点修改都要重新编译,单个工程的形式也不利于团队协作.为了提高工作效率,我希望利用DLL动态链接库的形式实现插件结构的编程. 插件结构的编程需要一个插件容器来控制各DLL的运行情况,将划分好的每个子系统安排到一个DLL库文件中.对每个DLL程序需要为容器预留接口函数,一般接口函数包括:启动调用DLL库的函数.关闭DLL库的函

Delphi中实现让TListView接收文件拖放

在使用Delphi开发应用程序时常常要使用到TListView列表视控件,但是仅仅使用TListView的原有属性.方法和事件是不够的,常常需要在程序开发过程中对列表视的功能进行扩展, 比如对列表视添加任意列组合排序.ListItem拖动.CustomDraw自绘制.加入背景图等功能,由此可见Delphi自带的TListView列表视控件功能有限,并不让人感到满意.为了让列表视具有更多的功能,我们只有求助于第三方控件,或者自己编写代码对TListView进行改造. 最近我在用Delphi开发一个

探索JSF框架中使用的设计模式

js|设计 设计模式可以帮助用户在更高层次上抽象细节,更好地理解体系结构.如果比较熟悉 GoF 设计模式和 JavaServer Faces (JSF) 框架,本文可以帮助您洞察 JSF 框架中使用的设计模式,深入理解其工作原理. 本文探讨了 JSF 框架中使用的设计模式.详细讨论的设计模式包括 Singleton.Model-View-Controller.Factory Method.State.Composite.Decorator.Strategy.Template Method 和 O