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

设计模式、用Delphi描述--Visitor模式

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

 

 

 

Visitor 模式

起源

Delphi中的Visitor模式在基本Visitor模式进行了扩展。更多Visitor模式的资料请参 [Gam+, pages 331..344].

目的

表示一个作用于某个对象结构的中和元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

 [Gam+, page 331].

动机

考虑一个面向对象的建模工具,比如说‘Rational Rose、ModelMaker’,它将一个模型表示为类和类的成员。

在建模工具上提供了许多操作成员功能,比如:列表类的所有成员、生成类的代码框架、反向工程等。

这些操作大多对不同的成员进行不同的操作。它将成员分成字段(fields)、方法(methods)、

属性(properties)。因些我们必须建立专门处理字段的类,专门处理methods的类等等。成员类的集合当然依赖被编译的语言。但对于一给定语言变化不大。

 

 

 

如图显示了部分成员类的框架。问题产生了,如果我将所有这些操作分散到不同的成员类,

将会导致整个系统难于理解,修改,维护。将类代码生成与类成员检查放在一起,将产生混乱。些外加入新的操作时要重新编译的有的类(至少也重新编译所有的相关的系)。有个办法:你可能独立的增加一个新的操作,并这个成员类独立如作用于其上的操作。

要实现上述两个目标,我们可以将每个类中相关操作包装在一上独立的对象(称为visitor

并在遍历类成员列表时将此对象传递给当前成员。当一个成员‘接受’ 访问,该成员向访问者发送包含自身信息的请求。该成员请自本身作为一个参数。访问者执行这些操作。

例如:一个不使用访问者的代码生成器可能会通成员类的抽象的方法:TMember.WriteInterfaceCode(Output: TStream)生成代码。每一个成员都会调用WriteInterfaceCode生成适当的输出代码。如果通过访问者来生成代码,则会创建一个TinterfaceCodeVisitor对象,并在成员列表上调用参数为访问对象的AcceptVisitor方法。每一个在员在实现AcceptVisitor将会回调visitor一个字段将调用访问者的VisitField方法,而一个方法则调用VisitMethod方法。这样,以前类Tfield的WriteInterfaceCode操作现在成为TinterfaceCodeVisitor的VisitField操作。

 

为使访问者不仅仅只做代码生成,我们需要所有的成员列表的访问者有一个抽象的父类TmemberVisitor。TmemberVisitor必须为每一个成员定义一种方法。一个需要将成员输出为HTML格式的应用将定义TmemberVisitor新的子类,并不再需要在成员类中增加与特定应用相关的代码。Visitor模式将每个操作封装在一个相关的Visitor中

 


 

 

 

使用Visitor模式,必须定义两个层次的类:一个应于接受操作的元素(Tmember层次)另一个定义于对元素的操作(TmemberVisitor 层次)。增加一个新的操作时只需给访问者层次增加一个新的子类。我可能简单的定义新的TmemberVisitor子类以增加新的功能。

 

应用

下面的代码演示上面描述的类Tmember的Visitor模式的应用

 

type

  TMember = class (TObject)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); virtual;

  end;

 

  TField = class (TMember)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); override;

  end;

 

  TMethod = class (TMember)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); override;

  end;

 

  TProperty = class (TMember)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); override;

  end;

 

  TMemberVisitor = class (TObject)

  public

    procedure VisitField(Instance: TField); virtual;

    procedure VisitMember(Instance: TMember); virtual;

    procedure VisitMethod(Instance: TMethod); virtual;

    procedure VisitProperty(Instance: TProperty); virtual;

  end;

 

implementation

 

{ TMember }

[1] [2] [3]  下一页


[电脑技术]简单描述计算机辅助教学CAI  [系统软件]InstallShield Express for delphi制作安装程序定…
[常用软件]InstallShield Express制作Delphi数据库安装程序  [Delphi程序]为什么选择Delphi.Net ?
[Delphi程序]《关于VisiBroker For Delphi的使用》(4)  [Delphi程序]Delphi 程序员代码编写标准指南
[Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro…  [Delphi程序]Borland Delphi 9 的新特性
[Delphi程序]Delphi 键盘码表  [Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗?
教程录入: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……
    咸宁网络警察报警平台