`
cooldesigner
  • 浏览: 68061 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Wrapper pattern

阅读更多

起源

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

目的<o:p></o:p>

 <o:p></o:p>

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

动机<o:p></o:p>

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

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

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

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

另外一种方法使用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;

 <o:p></o:p>

  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属性接口,<o:p></o:p>

 <o:p></o:p>

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;

可以看出来了通过TsampleWrapperSomeAction方法比引用SampleWrapper.Sample.SomeAction更直接。<o:p></o:p>

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

function TSampleWrapper.GetSomeValue: Integer;

begin

  Result := Sample.SomeValue;

end;

 <o:p></o:p>

procedure TSampleWrapper.SetSomeValue(Value: Integer);

begin

  Sample.SomeValue := Value;

end;

 <o:p></o:p>

function TSampleWrapper.SomeAction(const Data: string): Boolean;

begin

  Result := Sample.SomeAction(Data);

end;

说明一下类TsampleWrapper

·      被包装的成员的特性,在包装类中都有着同样的类型,如名称、数据类型,可见性、及其它个别特性。

·      被包装成员的属性也被包装成属性,并且可能通过readwrite方法访问。

·      被包装的成员也接供了属性访问接口,也可能通过readwrite方法访问。

·      事件与被包装起来,通过readwrite方法访问方法,胜于直接访问事件句柄。

·      方法也被包装起来了,并复接被包装类的方法的参数集、现样返回值也是被包装类的返回值。

分享到:
评论

相关推荐

    常见设计模式的解读和对应代码示例,包括设计原则和软件工程中类之间的依赖关系

    1、基础概念 1.2 类间关系 关联关系(Association) ...适配器模式(Adapter/Wrapper Pattern) 桥接模式(Bridge Pattern) 装饰模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern)

    Wrapper facade pattern

    **包装器外观模式(Wrapper Facade Pattern)** 包装器外观模式是一种软件设计模式,它将一个复杂的组件或者一组组件的接口进行简化,提供一个统一的、更易用的访问方式。这种模式通常用于隐藏底层系统的复杂性,为...

    A Regular Expression Wrapper Using ATL in C++.

    m_regexPattern = pattern; return m_regex.Compile(m_regexPattern); } ``` 这里,`m_regex`是一个`CAtlRegEx`对象,它是ATL提供的正则表达式类,用于执行正则表达式的操作。 `Match`方法可以检查输入的字符串...

    unity-utils-wrapper

    2. **单例模式(Singleton Pattern)**:Unity中的许多全局管理类,如GameManager或SceneManager,常使用单例模式确保在整个游戏生命周期内只有一个实例存在。 3. **脚本组件(Scriptable Objects)**:Unity的脚本...

    Ajax for Web Application Developers(Ajax网站开发)

    Creating a Custom Ajax Wrapper Creating an Ajax Updater Chapter 7. Using the Engine Getting Started Making a Request Engine Methods and Properties Chapter 8. Debugging The JavaScript on...

    CAS客户端JAR包版本3.3.3

    &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;!-- 该过滤器负责用户的认证工作,必须启用它 --&gt; &lt;filter-name&gt;CASFilter org.jasig.cas.client.authentication.AuthenticationFilter &lt;param-name&gt;...

    spmf-wrapper:WEKA 的 SPMF 包装器

    SPMF is an open-source data mining mining library written in Java, specialized in pattern mining.It is distributed under the GPL v3 license.It offers implementations of 88 data mining algorithms for:...

    cas 配置client 1.0 &2.0 及proxy DEMO 说明

    &lt;url-pattern&gt;/index.jsp&lt;/url-pattern&gt; &lt;!-- SingleSignOutHttpSessionListener LISTENER --&gt; org.jasig.cas.client.session.SingleSignOutHttpSessionListener &lt;welcome-file&gt;index.jsp ...

    ModelMaker5的帮助文件

    模式(Pattern)概念及其重要性 - **定义**:模式是一种解决问题的方法论,它描述了一个在特定上下文中如何解决某个常见问题的设计方案。设计模式特别强调软件设计中对象间的结构、职责分配以及交互方式。 - **重要...

    saliency detection on light field-cvpr 2014 code

    CVPR(Computer Vision and Pattern Recognition)作为国际计算机视觉领域的顶级会议,每年都会汇集众多前沿研究。2014年的一篇论文中,研究人员探讨了光场图像的显著性检测问题,并提供了相应的代码实现。本文将...

    使用一张或两张图片创建大背景网站

    background: url('wood-pattern.jpg') repeat; } #wrapper { background: url('centered-image.jpg') no-repeat center center; } ``` 这里,`#wrapper` 的背景图是居中的,而 `body` 的背景图则是重复的,从而...

    DIRegEx v7.0.0 XE2/XE3 32/64 Cracked

    DIRegEx offers two regular expression algorithms with their corresponding wrapper classes for easy usage: TDIPerlRegEx implements a matching algorithm with the same syntax and semantics as Perl. ...

    DIRegEx v8.6.8 for D4-XE10 字符 匹配 文本编辑

    DIRegEx offers two regular expression algorithms with their corresponding wrapper classes for easy usage: TDIPerlRegEx implements a matching algorithm with the same syntax and semantics as Perl. ...

    DIRegEx v8.5.0 for D4-XE6 cracked

    DIRegEx offers two regular expression algorithms with their corresponding wrapper classes for easy usage: TDIPerlRegEx implements a matching algorithm with the same syntax and semantics as Perl. ...

    React Bits 中文版

    ✔ Context Wrapper ✔ Event Handlers ✔ Flux Pattern ✔ One Way Data Flow ✔ Presentational vs Container ✔ Third Party Integration ✔ Passing Function To setState() ✔ Decorators ✔ Feature Flags ✔ ...

    Mybatis模糊查询及自动映射实现详解

    在上面的示例中,我们使用bind标签将参数username与% wildcard结合起来,形成一个新的参数pattern,然后在查询语句中使用该参数。 3. 使用CONCAT函数 使用CONCAT函数也可以实现模糊查询,例如: ```sql select ...

    servlet 原理

    以Tomcat为例,它遵循Java Servlet规范,提供了Context、Host、Engine等容器等级,其中Context容器直接管理Servlet的包装类Wrapper。每个Context对应一个Web工程,负责加载并管理该工程下的所有Servlet。 当Tomcat...

    在使用实现过滤器进行request包装,获取内层request的分析

    &lt;url-pattern&gt;/*&lt;/url-pattern&gt; ``` `filter`和`manager`这两个文件名可能代表了过滤器相关的其他内容,但没有具体的文件内容,无法给出详细的解释。通常,`filter`可能是对过滤器功能的进一步封装或抽象,而`...

    C++网络编程_卷1_卷2.part1.rar

    面向对象网络编程中的并发技术 ·ACE wrapper facades的设计原则和模式 有了这本书,C++开发者就有了一套最完整的、可以自如运用的工具包,从而能够方便、 高效地开发成功的、 多平台、并发式网络应用程序。 作者...

Global site tag (gtag.js) - Google Analytics