前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:装饰器模式(Decorator)

设计模式:装饰器模式(Decorator)

作者头像
firstxinjie
发布于 2025-05-18 02:02:42
发布于 2025-05-18 02:02:42
14200
代码可运行
举报
文章被收录于专栏:X#(XSharp)X#(XSharp)
运行总次数:0
代码可运行

装饰器模式类似于俄罗斯套娃,但又不是“容器套容器”的静态方式实现。

相较于后者,装饰器模式结构更清晰,也更容易扩展。但是对于可视组件进行“装饰”,会增加布局的复杂性,以及考虑状态的同步。因此,对于简单的场景,可以直接继承,而对于复杂的场景则可以选择其他的设计模式。

因此,该模式的最佳应用应该是针对非可视组件的“装饰”。

按照完整的模式描述,首先,我们需要确定具体实现和装饰器共同的基类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class Component as Custom
	Procedure DoSomething()
	EndProc
EndDefine 

具体的实现就可以这样定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class ConcreteComponent as Component
	Procedure DoSomething()
		? "具体实现需要执行的业务逻辑"
	endproc
EndDefine

考虑对具体实现可能进行不同的“装饰”,所以,需要定义具体装饰器的基类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class Decorator As Component
	Protected oComponent
	oComponent = .NULL.

	Procedure SetComponent(toComponent As Component)
	EndProc

	Procedure DoSomething()
		If !IsNull(This.oComponent) And Vartype(This.oComponent) = "O"
			This.oComponent.DoSomething()
		EndIf 
	EndProc
EndDefine

因此,第一个装饰器的定义就可以是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class ConcreteDecorator As Decorator 
	Procedure DoSomething()
		This.CustomDecoration()
		DoDefault()
	EndProc 

	PROCEDURE CustomDecoration()
		? "装饰器附加的业务逻辑"
	ENDPROC
EndDefine 

所以,最终的代码就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Local loConcreteComponent As ConcreteComponent, loConcreteDecorator As ConcreteDecorator 
m.loConcreteComponent = CreateObject("ConcreteComponent")
m.loConcreteDecorator = CreateObject("ConcreteDecorator")

m.loConcreteDecorator.SetComponent(m.loConcreteComponent)
m.loConcreteDecorator.DoSomething()

以上为该设计模式的 VFP 实现基本原理。

未完待续......

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 xinjie的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档