如何在Excel VBA中实现Decorator Pattern?编译错误问题求助
VBA实现装饰器模式的可行方案
你遇到的编译错误是因为VBA不支持直接将Sub过程作为参数传递给另一个Sub——代码里直接传toBeDecorated会被编译器识别为未定义的变量,而非过程引用。以下是两种可行的实现方式:
方式一:通过过程名字符串调用(简单快速)
利用Application.Run可通过字符串执行指定过程的特性,修改代码如下:
Sub runner(subroutineName As String) MsgBox "Decoration Before" Application.Run subroutineName MsgBox "Decoration After" End Sub Sub toBeDecorated() MsgBox "to be decorated" End Sub Sub fire() runner "toBeDecorated" End Sub
这种方式适合无参数的简单Sub,若需要传递参数,可扩展runner的参数列表,在Application.Run中一并传入。
方式二:类模块实现标准装饰器模式(面向对象)
如果需要更贴合装饰器模式的面向对象设计,可通过类模块实现:
- 创建接口类
IComponent:
Public Sub Execute() End Sub
- 创建具体组件类
ConcreteComponent:
Implements IComponent Private Sub IComponent_Execute() MsgBox "to be decorated" End Sub
- 创建装饰器基类
Decorator:
Implements IComponent Private m_component As IComponent Public Sub Initialize(component As IComponent) Set m_component = component End Sub Private Sub IComponent_Execute() If Not m_component Is Nothing Then m_component.Execute End If End Sub
- 创建具体装饰器类
BeforeAfterDecorator:
Implements IComponent Private m_decorator As Decorator Public Sub Initialize(component As IComponent) Set m_decorator = New Decorator m_decorator.Initialize component End Sub Private Sub IComponent_Execute() MsgBox "Decoration Before" m_decorator.Execute MsgBox "Decoration After" End Sub
- 标准模块中调用:
Sub fire() Dim baseComponent As IComponent Set baseComponent = New ConcreteComponent Dim decoratedComponent As IComponent Set decoratedComponent = New BeforeAfterDecorator decoratedComponent.Initialize baseComponent decoratedComponent.Execute End Sub
这种方式支持嵌套多个装饰器,扩展性更强,适合复杂的装饰需求。
内容的提问来源于stack exchange,提问作者Ahmed Ashraf
相关产品推荐
相关产品推荐

