转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
设计模式、用Delphi实现---->Wrapper pattern         ★★★★

设计模式、用Delphi实现---->Wrapper pattern

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1600 更新时间:2009/4/23 18:40:54

Wrapper pattern

起源

Delphi中的Wrapper模式是在 ‘Adapter’ or ‘Wrapper’ 的基础上上改造的。更多的介绍请查阅[Gam+, pages 139..150]。

目的

 

‘将一个接口转换成客户期待的别外一个接口。Wrappers 模式使得原本由于接口不兼容而不能一起工作类可以一起工作,参阅 [Gam+ 139].

动机

在Delphi的Object Pascal语言中类对多态性的支持远比接口对多态的支持高。同样意味着两个类虽然可以同时支持一个接口,但它们必须有相同的组先类,从而客户对象可以对类执行动态变换。但有时我们想使一些原本无关的类在一起工作,此时wrapper模式让你将一类包装成另一个类的接口。它类同于多重继承,但在Delphi是一种引用关系。

开始讲述下面的例了,好:

假设您有一个继承自Tobject并想安装到控件板的类:Tsample,但此时必须让组件支持Tcomponent。高兴的是有一种好的办法不用改变Tsample的继承关系就可以将转换成支持

Tcomponent(比如此时你没有类的源码,只有它的BPL包),创建一个继承于Tcomponent的新类TsampleWrapper,并将引用聚合类Tsample。此后类TsampleWrapper将是Tcomponent后代,你可以将它加入控件板了。你现在将Tsample包装成TsampleWrapper的一个成员变量,并为它接供一个专用的访问接口。TsampleWrapper将被委托接受它包装的类的所有行为。这样客户就可能适当的调用Sample的方法及Sample的属性。

另外一种方法使用wrapper pattern关有符合‘Law of Demeter’。些规律的基础是让你不要引用太深的对象。Tsample的访问接口和TsampleWrapper的关系如下:

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;

依照‘Demeter’s law’访问SampleWrapper.Sample是很好的。但SampleWrapper.Sample.SomeAction却不是好的实例。好的想法是在类TsampleWrapper中定义一个SomeAction方法,并通过SomeAction调度Sample.SomeAction方法。

你可能经常写过这样的代码:ListBox.Canvas.Brush.Color。 看起来有点违背 ‘Demeter’s law’

应用

上面描述的类演示了一个wrapper模式的应用。类TsampleWrapper聚合Tsample类,并接供了一个Sample的属性接口。现在我们创建一个更完整的wrapped模式的应用,为类TSampleWrapper创建一个叫SomeAction和一个叫SomeValue属性接口,

 

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;

  end;

可以看出来了,通过TsampleWrapper的SomeAction方法比引用SampleWrapper.Sample.SomeAction更直接。

类TsampleWrapper的实现代码如下:(一个可以编译的代码段)

function TSampleWrapper.GetSomeValue: Integer;

begin

  Result := Sample.SomeValue;

end;

 

procedure TSampleWrapper.SetSomeValue(Value: Integer);

begin

  Sample.SomeValue := Value;

end;

 

[1] [2]  下一页


[Web开发]通过伪静态规则实现子目录绑定  [Web开发]利用QQWry.Dat实现IP 地址高效检索
[Web开发]巧妙运用PHP函数实现采集器的制作  [Web开发]用PHP实现Javascript的escape(),unescape()的方法
[网页制作]利用HTML meta refresh 实现页面刷新与跳转(重定向…  [实用文档]基于WebGIS的杭州公交线路查询系统设计与实现毕业…
[办公软件]如何在Powerpoint 中(实现)输入上标、下标  [办公软件]如何实现Office工具栏、菜单以及菜单命令重命名
[办公软件]PowerPoint XP技巧之实现字幕上下移动动画  [办公软件]利用录制旁白功能在PowerPoint实现各种声音格式的…
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台