设计模式、用Delphi实现---->Decorator 模式

Delphi设计模式重构:策略模式替代复杂条件分支的工程实践.pdf 文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 如果你正在寻找一种高效、强大的编程语言来开发跨平台应用,那么Delphi绝对值得考虑!它拥有直观的可视化开发环境,让代码编写变得轻松简单。凭借着快速的编译速度和卓越的性能优化,Delphi能够帮助开发者迅速构建出高质量的应用程序。无论是Windows、macOS、iOS还是Android平台,Delphi都能完美支持,真正实现一次编写,多平台部署。选择Delphi,开启高效开发之旅! 立即下载

 

 

 

Decorator 模式

起源

Delphi的Decorator模式是在Decorator的基础上进行了扩展。更多Decorator模式的资料请参阅 《设计模式115页》

目的

动态地给一个对象添加一些职责。就增加功能来说,Decorator模式比增加子类更为灵活.

动机

我们经常要为某一些个别的对象增加一些新的职责,并不是全部的类。假设,我们有一组类用来输出文本行。抽象类TtextStream定义了一些接口,而后代如TtextFile、TlinePrinter、TclipboardStream则实现了这些接口。

现在,假设我们想给这些类增加一些新的职责如:文本缓存器、大小定转换、文本分析。

继承机制是添加功能的一种有效途径。从TtextStream类继承了缓存器可以被多个子类的实例使用。但不是很灵活。因为缓存器的选择是静态的了。客户程序不能控制选择缓存器的方式和时机。如此,加重了抽象类TtextStream的字段的负担来控制缓存器,并将带入到它的第一个实例中。通常最好保持高层次的(抽象)基类的轻量。在基类中增加不规则化和原文分析会使它最变得非常笨重!

如果你不想创建一个重量级的基类就会产生别外一个问题。有这样一种情况:大量的独立的继承是可能是,但瀑发式的产生大量的子类来支持不同组合如:TbufTextFile、TscrambledTextFile、TbufScrambledTextFile、TbufLinePrinter、TscrambledLinePrinter及其它。发生同样问题,如果类定义对子类隐藏或不可见的。比如说,如果你想在第三的组件库的高层类中加入一个新的职责,试着给Delphi的Tstream加入一个新的职责!

一个灵活的方法是将文本流嵌入另一个对象中,由这个对象加入缓存器或不规则化。我们称这个嵌入的对象为装饰(Decorator)。这个装饰与文本流组件接口一致,因些它对使用文本流客户程序是透明的。在Delphi中保持接口一致意味着从一个共公的组先继承,例中为TtextStream。装饰将请求向前转到到文本流,并且可能能转发前后执行一些额外的动作(如缓存器、不规则化),透明性使你可以递归的嵌套多个装饰,从面可以添加任意多的功能。

假设类TtextStream的接口如下:

type

  TTextStream = class (TObject)

  protected

    function GetEndOfText: Boolean; virtual; abstract;

  public

    function ReadLine: string; virtual; abstract;

    procedure WriteLine(const Line: string); virtual; abstract;

    property EndOfText: Boolean read GetEndOfText;

  end;

使用adapter可以创建一些真实的文本流组件,如TLinePrinter, TtextFile,其它更多的。为了保持接口的一致。使用decorator模式,我们可以灵活的为所有的文本流加入新功能。假设我们将装饰类命名为TtextFilter。这个类从TtextStream继承过来从而保TTextStream证接口的兼容,它同样包含了对TtextStream实例TextStream的引用。类TtextFilter没有实现任何新特性,它只是简单的将所有客户程序的请求(方法调用)转发给类TextStream。其后代如:TindentFilter、TupperCaseFilter通过简单重载装饰类的方法加入了一些新职责。

 

 

 

 

 

 

下面的流程图显示了TupperCaseFilter是如何调解客户程序对类TtextStream调用

 

 

此模式最重要的是让装饰类显示TtextStream能显示的任何部份。这样通常客户对调用装饰类和末装饰的类没有什么不同, 后它们对装饰类不存在任何依赖关系。在本单元的例子中,客户程序不知道它的文本在实际的写操作之前被转换成大写。

 

应用

下面的代码演示了类的装饰模式的应用。例子中的TtextStream为装饰类TtextFilter定义了一个抽象的接口。

type

  TTextStream = class (TObject)

  protected

    function GetEndOfText: Boolean; virtual; abstract;

  public

    function ReadLine: string; virtual; abstract;

    procedure WriteLine(const Line: string); virtual; abstract;

    property EndOfText: Boolean read GetEndOfText;

  end;

 

  TTextFilter = class (TTextStream)

  private

    FOwnsStream: Boolean;

    FTextStream: TTextStream;

  protected

    function GetEndOfText: Boolean; override;

    function GetTextStream: TTextStream;

    procedure SetTextStream(Value: TTextStream);

  public

    constructor Create(ATextStream: TTextStream; AOwnsStream: Boolean);

    destructor Destroy; override;

    function ReadLine: string; override;

    procedure WriteLine(const Line: string); override;

    property OwnsStream: Boolean read FOwnsStream write FOwnsStream;

    property TextStream: TTextStream read GetTextStream write SetTextStream;

  end;

 

代码说明:

·      属性TextStream包含了对装饰的文本流对象的引用。TextStream具有读、写的操作。这样对后代来说就更灵活了。一个类似的模式的proxy模式,通过读、写方法在proxy模式也是一种好的应用。有关proxy模式请参考《设计模式》。

·      属性OwnsStream用来TextStream的所有权。在下面的实现代码中你可以看到TtextFilter类在free它所有的文本流时先判断OwnsStream是否为真。它取到帮助装饰清除的作用。

·      TextStream、OwnsStream是装饰类的构造器的两个参数。

·      实现装饰类重载了ReadLine、WriteLine、GetEndOfText三个方法。并加入了实现。

下面是它的实现部分代码:

 

constructor TTextFilter.Create(ATextStream: TTextStream; AOwnsStream: Boolean);

begin

  inherited Create;

  TextStream := ATextStream;

  OwnsStream := AOwnsStream;

end;

 

destructor TTextFilter.Destroy;

begin

  TextStream := nil;

  inherited Destroy;

end;

 

function TTextFilter.GetEndOfText: Boolean;

begin

  Result := TextStream.GetEndOfText;

end;

 

function TTextFilter.GetTextStream: TTextStream;

begin

  Result := FTextStream;

end;

 

function TTextFilter.ReadLine: string;

begin

  Result := TextStream.ReadLine;

end;

 

procedure TTextFilter.SetTextStream(Value: TTextStream);

begin

  if Value <> FTextStream then

  begin

    if OwnsTextStream then FTextStream.Free;

    FTextStream := Value;

  end;

end;

 

procedure TTextFilter.WriteLine(const Line: string);

begin

  TextStream.WriteLine(Line);

end;

在这些实现代码一个非常有兴趣的是:

·      装饰类的行为方法:ReadLine、WriteLine、GetEndOfText只是简单的调用相应的TextStream方法。

·      SetTextStream方法在分配一个新的值前安全的释放它的方本流。

·      释造函数将TextStream := nil,因为在SetTextStream有可能释放当前的文本流。

现在可能真正的创建一个将文本转换成大写的过滤器了

接口部分的代码:

type

  TUpperCaseFilter = class (TTextFilter)

  public

»   function ReadLine: string; override;

»   procedure WriteLine(const Line: string); override;

  end;

 

implementation

 

function TUpperCaseFilter.ReadLine: string;

begin

» Result := UpperCase(inherited ReadLine);

end;

 

procedure TUpperCaseFilter.WriteLine(const Line: string);

begin

» inherited WriteLine(UpperCase(Line));

end;

这个装饰类可以被子任何TtextStream目标使用:

 

function TClient.CreateOutput: TTextStream;

begin

» { 创建一个基类}

» case Destination of

»   dsFile: Result := TTextFile.Create(GetFileName, fmCreate);

»   dsPrinter: Result := TLinePrinter.Create;

» end;

» {判断是是否使用了装饰, 并使用同样的参数

»   重要的是我们没必要关心是装饰TTextFile ,还是TLinePrinter }

» if ConvertToUpperCase then

»   Result := TUpperCaseFilter.Create(Result, True);

end;

 

procedure TClient.ListContents;

var

  T: TTextStream;

begin

  T := CreateOutput;

  { 在这里,我们并不知道是否使用了装饰}

  try

    {往T写内容 }

    T.WriteLine('Contents');

  finally

    T.Free;

  end;

end;

Delphi实例

正在组织。。。

数仓 - 促销敏感度、评论敏感度 1. 促销敏感度 步骤1. 首先按照最后一次下单时间及有无复购情况将用户分为四大群体: 近一年有购物行为且复购的用户 -- L1 (今年复购用户) 近一年有购物行为但无复购的用户 --L2 (今年一单购用户) 最后一次下单时间在1年之前且有复购的用户 --L3 (今年无购且只有一单用户) 最后一次下单时间在1年之前但无复购的用户 -- L4 (今年无购多单用户) 步骤2. 每一类用户群再根据优惠订单占比、每单优惠金额占比的平均值、优惠金额这三个指标进行k-means聚类,分为: 非常敏感 - 阅读详情

相关推荐

别再对着数据手册发愁了!用HFSS 2023 R2搞定ESP32-C3板载天线的阻抗匹配

本文详细介绍了如何利用HFSS 2023 R2进行ESP32-C3板载天线的阻抗匹配优化,解决实际PCB设计中常见的性能偏差问题。通过智能模型导入、科学参数扫描和量化优化流程,显著提升天线性能,适用于WIFI和蓝牙应用场景。

weixin_42523543的博客 448

Delphi版设计模式

用delphi诠释设计模式

QAQ的小耗子的博客 553

SAP Fiori单点登录避坑指南:从SAML原理到实战,解决‘第一次登录跳转主页失败’和‘偶发进不了单点’

本文深入解析SAP Fiori单点登录(SSO)的SAML实战与疑难排查,涵盖SAML协议核心机制、SICF登录优先级控制及安全诊断工具的高级用法。针对‘首次登录跳转主页失败’和‘偶发单点登录失效’问题,提供从配置优化到生产环境稳定运行的全面解决方案,助力企业高效实现数字化转型。

weixin_29327977的博客 405

Delphi版设计模式之单例二

​接上篇Delphi版设计模式之单例一,细心的朋友可能发现我在上一篇文章中重写类NewInstance和FreeInstance函数,原因是:【在delphi中编译器对构造函数的保护级别进行了处理,即便设为private,编译器仍然会将其修正为public,所以覆盖基类中的NewInstance类方法,系统在每次构造对象时都会调用这个类方法,通过重载它就可以实现对构造函数的控制】,同时在上篇文章中有一段核心代码 我以注释的形式标注这里在并发环境下存在安全隐患,那么现在我们就通过多线程的方式研究一下这个问.

舞动的代码 579

论文浅读之PIP-Net: Patch-Based Intuitive Prototypes for Interpretable Image Classification

这篇文章的主要贡献包括:1 提出了一种新型的可解释图像分类模型PIP-Net,它基于原型部分学习可解释的原型,实现内置解释性。2 PIP-Net采用自监督学习的新正则化方法,学习原型之间的相似性,使得 latent 空间中的相似性能更好地与人类视觉感知相一致,从而减小了所谓的语义差距。3 PIP-Net可解释为一个稀疏的打分表,它可以检测图像是否属于任何类,或是否属于多个类。它也可以对OOD数据进行分类并说“我没有看到过这个”。

qq_49370210的博客 1791

[捷稀 JCG Q30 Pro 刷机说明] 以刷入openwrt24.10为例

摘要: 本文详细介绍了捷稀JCG Q30 Pro路由器刷入OpenWrt 24.10系统的步骤。通过先刷入OpenWrt 23.05过渡固件,再升级Uboot,最后通过TFTP加载工厂镜像完成刷机。关键步骤包括解锁分区、刷写Uboot、进入恢复模式及配置网络。文章还提供了无线设置、Tailscale内网穿透等进阶命令,并附参考文档和固件下载链接。适用于有一定技术基础的玩家,需注意操作风险,严格按流程执行。

贤时间 7138

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

Wrapper pattern起源Delphi中的Wrapper模式是在 ‘Adapter’ or ‘Wrapper’ 的基础上上改造的。更多的介绍请查阅[Gam+, pages 139..150]。目的 ‘将一个接口转换成客户期待的别外一个接口。Wrappers 模式使得原本由于接口不兼容而不能一起工作类可以一起工作,参阅 [Gam+ 139].动机在Delphi的O

programlover的专栏 1008

Oracle Patch清理

- opatch clean的帮助,该命令清除.patch_storage directory文件夹下的'restore.sh,make.txt' files and 'scratch,backup'-- 执行完毕后,貌似没有变化,可能和自己环境有关(19年开始测试补丁,基本上每个季度都测试,后面把又把数据库用RMAN做了迁移,又转换成了PDB模式)。在对Oracle安装补丁后,会发现OS上被占用了大量的空间,本文档清理Opatch过程中的一些文件,释放空间。--清理后空间,剩余25G。

文档搬运工 1072

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteControlTest [转]...

//命令的接受者 unit uReceiveObject; interface type TLight = class(TObject) public procedure Open; procedure Off; end; TGarageDoor = class(TObject) public procedure Up; procedure Down...

weixin_30872789的博客 135

【Python・统计学】(两)多因素方差分析(原理及代码)

自学笔记,分享给对统计学原理不太清楚但需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文不涉及公式讲解(文科生小白友好体质)~(部分定义等来源于知乎) 本文重点:多因素方差分析 【1.多因素方差分析简单原理】 【2.多因素方差分析步骤】 【3.多因素方差分析代码】

TUTO_TUTO的博客 4865

YOLOv13多分支融合机制+SE注意机制 RepVGGBlock_OREPA架构 map提升4.89,召回率提升8.66

本文提出了一种改进的YOLOv13目标检测模型,通过引入RepVGGOREPA模块和重参数化技术,显著提升了模型性能。实验结果表明,采用RepVGGBlock后,mAP提升4.89,召回率提升8.66%。文章详细介绍了模型移植过程,包括创建YOLOv13-REPVGGOREPA配置文件、修改任务处理代码和模块初始化文件,并提供了完整的OREPA模块实现代码。该模块通过多尺度特征融合和SE注意力机制,实现了训练时的丰富表征能力和推理时的高效计算,为YOLO系列模型提供了新的优化思路。

FJN110的博客 2650

设计模式---Delphi 篇

本文以“观察者”设计模式介绍 “对象--关系映射 ORM ”下面以Delphi  tiOPF 框架实现原理介绍:Abstract the Visitor logicBefore we go any further, we must abstract the Visitor functionality away from the business objects so we never

Mr.Kim.Wu 的日记 1367

YOLO车辆测距、车辆识别与单目测距

YOLO(You Only Look Once)是一种实时物体检测系统,能够识别视频或图像中的多个对象,并确定其位置。结合车辆识别与单目测距技术,YOLO可以用于交通监控、自动驾驶等应用场景,通过单个摄像头实现车辆的识别与距离测量。YOLO结合单目测距技术,在多个应用领域展现出巨大的潜力与灵活性。其实时性和准确性为智能交通、自动驾驶等领域提供了强有力的技术支持。

走向CTO的路上... 1678

设计模式、用Delphi实现---->Singleton 模式

Singleton模式起源Delphi的SINGLETON模式是在SINGLETON的基础上进行了扩展。更多SINGLETON模式的资料请参阅 《设计模式84页》目的保证一个类仅有一个实例,并提供一个访问它的全局访问点,一个相对简单的应用型设计模式动机此模式最重要的是保证大量类正确的访问单个实例。尽管一台个系统可能有多台打印机,但系统只允许有且只有一个打印缓存。同样比如:一

programlover的专栏 1176

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 605

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Delphi模式编程

Delphi模式编程

qqrrjj2011的博客 1512

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook

模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。 1.CoffeineBeverageWithHook {《HeadFirst设计模式》之模板方法模式 } { 编译工具: Delphi7.0 } { E-Mail : xshlife@163.com } unit uCoffeineBeve

djCode 733

Delphi五种设计模式

<br />今天抽空浏览了一下Delphi写的设计模式,网页在如下位置:<br />http://www.delphi-jedi.org/art_patterns.html<br />今天再看。仍然有种感觉。我把Observer模式的代码补充到下面。在Delphi 7已经编译通过。Lazarus应该也没有问题。<br />unit Unit2;<br />interface<br />type<br />TObservable = class;<br />TObserver = class;<br />TO

astra_zhao的专栏 2352

用 Delphi 学设计模式(二) 之 工厂方法篇

“开闭原则”:一个模块应该易于扩展,免于修改 问题:请考虑上一章的例子中,如果添加一个新的具体水果类“西瓜”需要做哪些工作。 本章完成以下内容: 1、代码用支持中文的 Delphi 2005 编译并通过,并去除了其中一些无关紧要的地方,如异常处理等 ; 2、重新设计一个情景,分别用“简单工厂模式”和“工厂方法模式”两种方法实现,请体...

weixin_30606669的博客 174

Delphi语言的编程范式

Delphi语言是Object Pascal的一个扩展,结合了结构化编程、面向对象编程(OOP)和事件驱动编程等多种编程范式。以其简洁明了的语法和强大的类库,Delphi使开发人员可以高效地开发Windows应用程序、Web应用程序以及移动应用程序。Object Pascal在Pascal语言的基础上增添了面向对象编程的特性,例如类、继承、多态和封装等。这些特性使得程序的结构更清晰、可维护性更高。同时,Object Pascal也支持异常处理、集合、接口等特性。

2501_90394924的博客 949

Delphi面向对象设计:如何构建优雅的类结构

职责明确的边界清晰的扩展方便的使用简单的维护轻松的记住:代码首先是给人读的,其次才是给机器执行的。即使是在强调性能的Delphi开发中,良好的设计也能带来长期的可维护性优势。

mgcps的专栏 359

《大话设计模式》之 简单工厂模式 Delphi/C shap /JAVA 实现

{计算器的功能实现 实现工厂设计模式 通过面向对象的思想,进行设计,所用的编程思想为对象的三大特性:封装,继承,多态 通过实现一个简单的 计算器的功能(输入两个数,进行加,减,乘,除) 思想思路: 1.设计虚拟父类; 2.子类继承父类 3. 通过虚拟方法,进行进行重载 4.工厂类,实例化对象,采用多态 }unit uOperation;i

tjb_1216的专栏 2314

技术演进中的开发沉思-62 DELPHI VCL系列:VCL下的设计模式

本文探讨了DELPHI VCL开发中的三种设计模式:Factory/FactoryMethod、Bootstrap和ForEach。Factory模式通过分离对象创建与使用降低耦合度;Bootstrap模式为程序启动提供标准化初始化流程;ForEach模式则标准化集合遍历操作。文章结合VCL实例,展示了这些模式如何将理论转化为实践,提高代码质量和可维护性。这些设计模式作为开发"指南针",帮助开发者构建更规范高效的程序架构。

你的天空阅读专栏 1050

设计模式、用Delphi描述-->Abstract Factory模式

Abstract Factory模式(抽象工厂)起源Delphi中的Abstract Factory模式在基本Abstract Factory模式进行了扩展。更多Abstract Factory模式的资料请参阅 [Gam+]目的提供一个创建一系列相关或互依赖对象的接口,面无需指定它们的具体的类。动机这种模式是将你的应用与具体的类分类的最好办法,比如说,你要覆盖Delphi的

programlover的专栏 1002

Delphi5实现主要——明细型数据库应用

主要——明细型数据库应用程序通常包含至少两个数据库表,其中一个表作为“主表”,存储综合信息或主要数据;另一个或多个表作为“明细表”,存储与主表相关联的详细数据。:在主要——明细型数据库中,主表和明细表之间最常见的关系是一对多关系。这意味着主表中的一条记录可以在明细表中有多条相关联的记录。例如,一个客户(主表)可以有多个订单(明细表)。:在应用程序中,用户可以通过主表浏览综合信息,并通过明细表查看与特定记录相关联的详细信息。在Delphi中,主要——明细型数据库是一种数据库应用程序的设计模式,它涉及到。

weixin_52116519的博客 1269

Delphi版设计模式之单例一

可能Delphi王朝真的没落了,在网上查了很久都是一些重复、陈旧、残缺不全的帖子,搞的像古代的武功秘籍一样,每次只能获取上篇或者下篇,而这些上下还有可能是残篇 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 引自菜鸟教程 从上面的话中不难看出,所谓的设计模式是针对一些常见问题总结出来的一套比较优质的解决方案,所以

舞动的代码 890
上一篇: 设计模式、用Delphi描述-->Visitor模式
下一篇: 设计模式、用Delphi实现----&gt;Strategy模式
programlover
博客等级 码龄26年 1粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值