设计模式、用Delphi实现---->Template Method模式

delphi 在word模板中贴数据 如果需要word模板,并且在delphi中将数据插入到word中的操作步骤:下面操作涉及的变量:var i,j:integer; FileName:string; vl_str,vl_sql:string; ksh,kslb:string ; bookmarkCount,vl_answer:integer; bookmarkName:string;... 阅读详情

 

 

Template Method模式

起源

Delphi的Template Method模式以Object Pascal的虚函数为基础的结构型模式。

 

目的

定义一组算法操作的框架,定义一些不改变算法结构的子类。

动机

·         更好地封装策略方针并分发到不同的代理。

·         更好地实现复杂算法的代码重用,基类封装不可变的部分,并让子类实现可重载的部分行为方法。

·         更好地通过子类的可扩展部分提供钩子式的操作,但template method模式只允许通过基类来调用。

 

UML图示:

应用

先让我们看看几个使用了template method模式VCL组件。在下例中,VCL组件中的抽象类Tstream(定义于classes.pas)实现了流拷贝方法CopyFrom(),template 方法CopyFrom()包含了流拷贝的必需的算法。TStream 将Read()和Write()方法声名为抽象方法,并将实现延期到其具体的子类。CopyFrom()通过ReadBuffer()、WriteBuffer() 访问Read()、Write(),

ReadBuffer()、WriteBuffer()为模板方法。以后它们将提供静态并简单Read()和Write()虚方法接口。Read() 和 Write()为指定的扩展点并在派生类中执行

更的详细实现代码请参阅VCL的classes.pas单元的,抽象类Tstream和具体的流类:TCustomMemoryStream/TmemoryStream及TstringStream。通常template方法在基类中被定义为静态,并且派生的操作定义为虚方法,以后你只需要在子类中重载扩展点。对了,接口不支持template方法。

 

 

{抽象类 TStream}

 

  TStream = class(TObject)

  private

  …

  protected

    procedure SetSize(NewSize: Longint); virtual;

  public

 

//源类支持的原始的方法

    function Read(var Buffer; Count: Longint): Longint; virtual; abstract;

    function Write(const Buffer; Count: Longint): Longint; virtual; abstract;

    function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;

 // template方法

    procedure ReadBuffer(var Buffer; Count: Longint);

    procedure WriteBuffer(const Buffer; Count: Longint);

 

    // 封装了由模板方法实现的流拷算法

    function CopyFrom(Source: TStream; Count: Longint): Longint;

  …

  end;

 

 

 

//具体类

  TStringStream = class(TStream)

  … 

  public

    constructor Create(const AString: string);

// 具体类实现了可重载的方法

    function Read(var Buffer; Count: Longint): Longint; override;

    …

    function Write(const Buffer; Count: Longint): Longint; override;

    …

  end;

 

 

---------

 

{ TStream }  // 抽象类

…

 // template方法

procedure TStream.ReadBuffer(var Buffer; Count: Longint);

begin

  if (Count <> 0) and (Read(Buffer, Count) <> Count) then

    raise EReadError.Create(SReadError);

end;

 

procedure TStream.WriteBuffer(const Buffer; Count: Longint);

begin

  if (Count <> 0) and (Write(Buffer, Count) <> Count) then

    raise EWriteError.Create(SWriteError);

end;

 

function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;

const

  MaxBufSize = $F000;

var

  BufSize, N: Integer;

  Buffer: PChar;

begin

  if Count = 0 then

  begin

    Source.Position := 0;

    Count := Source.Size;

  end;

  Result := Count;

  if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;

  GetMem(Buffer, BufSize);

  try

    while Count <> 0 do

    begin

      if Count > BufSize then N := BufSize else N := Count;

      Source.ReadBuffer(Buffer^, N);

      WriteBuffer(Buffer^, N);

      Dec(Count, N);

    end;

  finally

    FreeMem(Buffer, BufSize);

  end;

end;

 

 

---------

{ TStringStream } // 具体类

…

// 具体类实现了源始的操作

function TStringStream.Read(var Buffer; Count: Longint): Longint;

begin

  Result := Length(FDataString) - FPosition;

  if Result > Count then Result := Count;

  Move(PChar(@FDataString[FPosition + 1])^, Buffer, Result);

  Inc(FPosition, Result);

end;

 

function TStringStream.Write(const Buffer; Count: Longint): Longint;

begin

  Result := Count;

  SetLength(FDataString, (FPosition + Result));

  Move(Buffer, PChar(@FDataString[FPosition + 1])^, Result);

  Inc(FPosition, Result);

end;

delphi模板 delphi模板,包括登陆、用户管理、系统日志等. 立即下载

相关推荐

国产NAS哪家强?极空间&绿联&威联通&群晖对比

随着个人数据量暴增,传统网盘空间不足和下载速度慢问题愈发凸显。新势力NAS,作为数据管理领域的璀璨新星,正以其独特的互联网设计理念,引领家庭及小型办公用户向数据存储的新纪元。它不仅仅是一款产品,更是为初学者用户量身定制的贴心伙伴。其系统界面之简洁、操作流程之直观,让人一目了然,真正实现了“即插即用”的极致便捷。同时,新势力NAS在保持专业水准的同时,更提供了多样化的扩展性配置,轻松应对各种数据存储与管理需求,让家庭及小型办公场景下的数据管理变得前所未有的简单与高效。

专注大数据、云计算、人工智能、机器人领域技术传播 3646

Template 模式之Delphi实现

unit Tpl_meth;{Design pattern example -some simple classes using the Template Method pattern.}interfacetype  TAbstractTemplateClass = class(TObject)  protected    function Algorithm_StepA: Integer

largewang的专栏 1110

EPLAN电气设计精华 -模拟量传感器画法全解

本文介绍了EPLAN中模拟量压力传感器的标准画法要点,重点解析了电流型(4-20mA)、电压型(0-10V/0-5V)和特定应用型三种传感器的核心特点、典型符号、接线方式及应用场景。文章提供了EPLAN设备标识符示例,并分享了一个实际项目案例(XJC-Y01-20-4M传感器配合XJC-608T-F变送器和GSEE.GXLK-AI4S-I模块的应用),强调绘制前查阅技术资料的重要性。内容简明实用,有助于规范电气设计中的传感器绘制。

Qinmingyue13的博客 1181

再谈Delphi 7控制Word 2000——使用模板

我首先想说明的是这篇文章算是我以前写的“使用Delphi 7控制Word 2000生成文档的方法”http://blog.csdn.net/neowang/archive/2004/10/08/127522.aspx的续篇(到目前为止,该文章已经被浏览了214+11次)。因为用户的需求发生了改变,我不得不在复习备考自然辩证法的几天里挤出时间来改写源程序来满足新的需求(看在是老同学的面子上,另一方面

Jarod's Blog 3081

拉普拉斯矩阵

1、预备知识 拉普拉斯矩阵定义为:L=D-W。其中,D为度矩阵,W为权重矩阵。 (1)D是对角矩阵,对角线上的元素时节点的度,即所有与该节点相关联的边的权重之和;对角线以外的元素为0。有向图的对角矩阵分为 出度矩阵 和 入度矩阵。 图1.1 无向图中的度矩阵 (2)W在无向图中是对称矩阵,在有向图中是非对称矩阵。 ...

zzhe 1万+

腾讯ACE反作弊系统:内核驱动与AI行为分析如何守护游戏公平

在游戏安全领域,反作弊技术是保障公平竞技环境的核心防线。其基本原理是通过监控系统关键行为,识别并阻断非法的第三方程序干预。从技术实现看,现代反作弊方案普遍采用分层防御架构,结合用户态模块进行应用层检测,并依赖内核态驱动实现底层深度监控,以此构建纵深防御体系。这种技术的核心价值在于,它能有效对抗从简单内存修改到高级驱动级作弊等多种威胁,维护游戏经济系统和玩家体验的完整性。随着作弊手段的演进,行为分析与AI赋能变得至关重要,系统通过机器学习模型分析进程行为序列的异常模式,即使面对未知特征的外挂变种也能进行有效识

weixin_33978578的博客 743

流式对象的实现原理和应用

流式对象的实现原理和应用  Stream对象,又称流式对象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的统称。它们分别代表了在各种媒介上存储数据的能力,它们将各种数据类型(包括对象和部件) 在内存、外存和数据库字段中的管理操作抽象为对象方法,并且充分利用了面向对象技术的优点,应用程序

爱在窗外的专栏 1537

c++对halcon的动态链接库dll封装及调用(细细讲)

本文详细介绍了将Halcon图像处理算法封装为C++动态链接库(DLL)的完整流程,包括7个关键步骤:1)封装Halcon函数并导出CPP文件;2)在C++项目中配置Halcon环境(包含目录、库目录设置);3)验证Halcon代码;4)创建DLL项目并进行环境配置;5)编辑DLL并导出生成文件(.dll、.lib、.h);6)在主项目中配置DLL调用环境;7)编写测试代码验证功能。通过这个流程实现了Halcon算法的模块化封装和复用,文中提供了具体的配置路径和代码示例,重点说明了环境配置细节和文件结构安排

Tianwen_running的博客 967

DELPHI Stream对象

<br /><br />Stream对象,又称流式对象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的统称。它们分别代表了在各种媒介上存储数据的能力,它们将各种数据类型(包括对象和部件)  <br />在内存、外存和数据库字段中的管理操作抽象为对象方法,并且充分利用了面向对象技术的优点,应用程序可以相当容易地在各种Stream对象中拷贝数据。<br />  下面介绍各种对象的数据和方法及使用方法。<

学习笔记,摘抄。 921

华为od 面试八股文_C语言_02_含答案

华为od 面试八股文_C语言_02_含答案

MISAYAONE的博客 2230

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

具身机器人和通用AI 5232

12.Delphi异常处理与程序调试

在应用程序开发中如何检测、处理程序的运行错误是一个很重要的问题。在 Delphi 的集成开发环境( IDE )中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误。但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、磁盘不能读写等。这些情况不仅会导致应用程序异常中止而且可能引起系统的崩溃。针对这...

weixin_30437481的博客 485

基于PCL的电力线点云提取与分割实现

本文基于PCL库实现电力线点云提取与分割,包含6个核心处理阶段:文件读取与结果文件夹创建、高程滤波分割候选点云、欧式聚类去噪、电力线分段提取、球形邻域搜索补全点云、最终分割与可视化保存。通过PCA计算点云线性特征(阈值0.91)筛选电力线点,采用欧式聚类(容忍度3.0)去除噪点,并针对不同规模聚类差异化设置球形搜索半径(4.0/6.0)补全点云。最终通过欧式聚类分割并可视化带颜色点云。算法对高程滤波阈值、聚类参数等具有敏感性,需根据点云特性调整优化。

weixin_45196569的博客 192

Delphi之创建组件模板(Component Template)

New Term 组件模板(Component Template)是指修改后保存下来供以后再使用的一个或一组组件。 组件模板可用来创建、保存和重复使用组件组。实际上,组件模板不必是一组组件,完全可以是单个组件。举一个小例子对理解组件模板的用途会很有帮助,但先要简要介绍一下Windows编辑控件(edit control)。 与所有的Windows控件一样,标准Windows单行编...

weixin_34184561的博客 234

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Stream对象又称流式对象

Stream对象又称流式对象 Stream对象,又称流式对象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的统称。它们分别代表了在各种媒介上存储数据的能力,它们将各种数据类型(包括对象和部件)  在内存、外存和数据库字段中的管理操作抽象为对象方法,并且充分利用了面向对象技术的优点...

weixin_33724059的博客 241

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Delphi中Templates代码模板添加注意事项

今天用Delphi中的代码模板添加一段代码,结果就是有问题,多次测试后,发现是编码需要注意。 <?xml version="1.0" encoding="GB2312" ?> <!--若下面的数据中包含中文,这里必须要用GB2312,否则这个代码模板将无法使用--> <codetemplate xmlns="http://schemas.bo...

JRSA2010的博客 370

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Delphi里的模板类

{Anyway I thought I would take the original idea by Rossen and extend the article to include interfaces as well as classes. The original article dealt with an example of how to create a Collec...

dengshisha4819的博客 405

流操作的语法

Delphi在这两方面都做的相当出色。在Delphi的早期版本Turbo Pascal 中就曾有流(Stream)、群(Collection)和资源(Resource)等专门用于对象式数据管理的类。在Delphi中,这些功能得到了大大的加强。Delphi将对象式数据管理类归结为Stream对象(Stream)和Filer对象(Filer),并将它们应用于可视部件类库(VCL)的方方面面。它们不仅提

lyh_116的专栏 1142

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 333

访问者模式详解

汇总目录请点击访问:《设计模式目录汇总》 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!

2601_96797912的博客 19

设计模式之状态模式

状态模式是一种行为型设计模式,通过将对象的不同状态行为封装到独立的状态类中,使上下文对象在状态变化时自动切换行为。以外卖订单为例,不同状态(如待支付、配送中)对同一操作(如取消)有不同响应。状态模式避免了复杂的if/else判断,提升代码可维护性与扩展性。其核心由上下文(Order)、状态接口(OrderState)和具体状态类组成,通过委托机制实现状态间的平滑切换。

FallingGod的博客 142

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 206

设计模式速查

本文梳理12个核心设计模式,涵盖创建型、结构型与行为型,提供简洁Java实现与面试要点。重点解析单例(静态内部类)、工厂(方法/抽象)、建造者(链式构建)等高频模式,强调代码可维护性与扩展性,附速记口诀与对比表格,助力开发与面试双提升。

ttlovet的博客 172
上一篇: 设计模式、用Delphi实现---->Singleton 模式
下一篇: 与大虾对话: 领悟设计模式
programlover
博客等级 码龄26年 1粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值