在实际的工作中偶尔会遇到如下情况:让一个类继承架构的对象实体能够通过一致的方法执行另外一个目标类对象的方法或是独立的函数,目标类需要被执行的方法或是独立的函数可以自由地改变或是增加而会影响执行类的架构。这个时候就会用到ForEach设计模式。
ForEach模式的目的是让拥有稳定继承架构的类对象能够执行外部可变化的方法或是函数。它适用于以下两种情况:
- 如果应用系统中已经有一个稳定的继承架构,而这个类架构须加入新的方法或是需要执行一些方法,但是我们并不想改变继承架构或是修改类声明,以避免经常重新编译或是造成很脆弱的继承架构
- 一个Collection对象需要对其子项执行许多会改变的函数,而又希望拥有一致的机制让每一个子项都能够执行这些外部函数
实现
如上图,左边的一个稳定的类继承架构,在父类中可以定义一个虚拟方法ForEach,这个方法接受一个参数,就是需要执行的外部类方法或是独立方法。若希望TChild1执行Target中的Routine2这个方法,则可以使用如下代码
aChild:TRoot;
aTarget:Target;
begin
aTarget:=Target.Create;
aChild:=TChild2.Create;
......
aChild.ForEach(aTarget.Routine2);
......
end;
第二种ForEach设计模式经常使用在Collection管理的动态子项对象中,而且这些对象都需要执行外部可能变化的方法或函数,在这种应用中便可以定义一个外部目标对象,在这个目标对象中有许多的方法,它们需要执行。当特定的方法需要执行时,只要调用Collection定义的ForEach方法,再由Collection一一地要求所有子项顺序的执行外部方法即可。
使用举例
假设需要对窗体中的某类组件执行某些操作(为了方便后面说明,这里假设对窗体上部分TListView组件进行操作)。则可以使用ForEach模式。首先定义出外部方法的标准模式TRunner,然后再定义一个Manager类,负责管理TListView组件,并在其中定义一个ForEach方法。
TRunner=procedure(AListView:TListView)ofObject;
TLVManager=class
private
FList:TList;
public
constructorCreate;
destructorDestroy;override;
procedureAddListView(AListView:TListView);
procedureForEach(ARunner:TRunner);
end;
implementation
procedureTLVManager.AddListView(AListView:TListView);
begin
FList.Add(AListView);
end;
constructorTLVManager.Create;
begin
FList:=TList.Create;
end;
descturctorTLVManager.Destroy;
var
i:Integer;
begin
fori:=FList.Count-1downto0do
TListView(FList.Items[i]).Free;
FList.Clear;
FreeAndNil(FList);
inherited;
end;
procedureTLVManager.ForEach(ARunner:TRunner);
var
i:Integer;
begin
fori:=0toFList.Count-1do
ARunner(TListView(FList.Items[i]));
end;
我们将需要执行的外部方法全部定义的TExternalRoutines类中
TExternalRoutines=class
public
procedureRoutine1(AListView:TListView);
procedureRoutine2(AListView:TListView);
end;
当应用程序在执行期间需要所有由TLVManager类管理的ListView执行TExternalRoutines类的某一个方法时就调用TLVManager的ForEach方法。
mng:TLVManager;
Runner:TExternalRoutines;
//客户端程序初始化部分
begin
mng:=TLVManger.Create;
//添加ListView到TLVManager中
mng.AddListView(ListView1);
......
Runner:=TExternalRoutines.Create;
end;
//客户端程序执行部分
begin
mng.ForEach(Runner.Routine1);//对被加入到TLVManager中的ListView执行Routine1方法
end;
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
在给出的文件信息中,我们可以了解到关于Delphi VCL(Visual Component Library,视觉组件库)的详细继承关系。VCL是Borland公司为Delphi开发的一套丰富的组件库,用于快速开发具有丰富图形用户界面的应用程序。 ...
安装 DevExpress for Delphi VCL 17.2.4 的过程非常简单,只需运行压缩包中的安装包,按照向导提示进行即可。"一键安装"意味着该版本已经集成了所有必要的组件和设置,用户无需进行复杂的配置,节省了开发者的宝贵...
在本压缩包中,开发者可以找到关于DevExpress Delphi VCL组件的各种技术细节、使用示例、API参考等,这些内容对于初学者和有经验的开发者来说都是非常宝贵的资源。 在Delphi的VCL框架中,开发者可以使用DevExpress...
在本主题中,我们关注的是如何在Delphi中利用VCL进行UDP通信。 标题"vcl.rar_Delphi VCL_delphi udp_vcl"暗示了我们将探讨如何在Delphi的VCL框架下实现基于UDP的网络通信。UDP(User Datagram Protocol)是一种无...
《Delphi VCL组件开发实例》是一份深入探讨Delphi集成开发环境中VCL(Visual Component Library)组件开发的专业文档。VCL是Delphi的核心部分,它提供了一整套丰富的用户界面控件和类库,使得开发者能够快速构建...
本教程将针对不熟悉DevExpress VCL安装过程的新手进行详细讲解,让新手能够顺利地在Delphi环境中安装并使用这一组件库。 首先,安装DevExpress VCL需要下载相应的安装包。在提供的文件列表中,“DevExpressVCL安装...
"神经网络 Delphi VCL"是一个专为Delphi设计的组件库,它允许开发人员在VCL(Visual Component Library)环境下轻松集成神经网络功能。 Delphi VCL是一个面向对象的库,用于创建Windows应用程序。它提供了丰富的...
Delphi VCL(Visual Component Library)架构是Delphi编程环境中核心的部分,它为开发者提供了丰富的图形用户界面(GUI)组件库。VCL是基于Object Pascal语言的,它使得开发高效、本地化的Windows应用程序变得非常...
在Delphi VCL(Visual Component Library)环境中,线程同步是一个关键的概念,特别是在多线程编程中。Synchronize方法是Delphi中用于在主线程和工作线程之间进行通信的关键工具,确保对用户界面(UI)的操作是安全...
在Delphi 11.3开发环境中,开发者经常会遇到需要在一个传统的VCL(Visual Component Library)窗体上嵌入FireMonkey (FMX)组件的情况。这通常发生在开发跨平台应用程序时,因为FMX提供了对多操作系统的支持。本知识...
通过Delphi VCL的强大可视化设计和事件驱动编程模式,可以极大地提高开发效率,同时保持代码的整洁和可维护性。 总的来说,"delphi VCL带源码,无限制经典mmtools,音频控件"是一个对于Delphi开发者特别是音频应用...
在Delphi编程环境中,NativeExcel是一个强大的库,它允许开发者直接在VCL(Visual Component Library)框架下处理Excel文件,无需依赖Microsoft Office组件。这个库的出现极大地简化了Delphi程序员在处理Excel数据时...
本文将深入探讨“NewNoteBook D6-XE7 Delphi VCL”这个NoteBook控件,它是专门为Delphi编程环境设计的。 首先,让我们了解“NewNoteBook”。标题中的“NewNoteBook D6-XE7”指的是该控件适用于Delphi从D6(Delphi 6...
ZipTV VCL组件使得开发者无需深入了解压缩算法的细节,就能轻松地在Delphi程序中添加创建、读取、修改和提取ZIP档案的功能。 【标签】中的关键词: 1. **delphi_vcl**:指的是Delphi的Visual Component Library,它...
FFVCL则是基于FFmpeg的VCL(Visual Component Library)组件,将这些功能集成到Delphi的开发环境中。开发者可以像使用其他Delphi组件一样,通过拖放和设置属性来实现复杂的音视频操作。 在提供的压缩包中,包含以下...
本文将重点介绍标题为“delphi 蓝牙VCL——BlueToothFramework”的资源,通过深入解析其核心组件和功能,帮助读者理解如何在Delphi中构建蓝牙应用程序。 BlueToothFramework是专门为Delphi开发者设计的一个蓝牙VCL...
在Delphi编程环境中,我们可以利用VCL(Visual Component Library)库来创建SNMP应用,实现对网络设备的监控和配置。 标题中的"SNMP.rar_HTTPSend_delphi_SNMP Delphi VCL_delphi HTTPSe_delphi h"暗示了这是一个...
DevExpress VCL for Delphi 是一套功能强大的可视化组件库,广泛应用于Delphi开发环境中的各种应用程序开发。该组件集提供了丰富的控件,包括数据网格、图表、报表等,可以极大提高开发效率,并使应用程序具有出色的...