在VBA中使用设计模式

  今天Get到了VBA中的面向接口编程,以后写VBA代码就会优雅好看一些,而不只是简单粗暴地完成任务了事。

  设计模式是一种良好的写代码套路,被编程者在应用面向对象的语言时所广泛采用。

  在设计模式的运用中,接口作为重要数据类型不可或缺,VBA虽然不支持接口定义,但是用类来模拟接口,进而继承或者实现,就可以在VBA的编码中使用设计模式,让代码更加优雅、规范。

  以策略模式为例:

  1、定义计算接口:

Option Explicit

'定义抽象方法
Public Function Calculate(ByVal a As Double, ByVal b As Double) As Double
End Function

  2、定义实现的算法

  ⑴ 加法

Option Explicit
Implements I计算

Public Function I计算_Calculate(ByVal a As Double, ByVal b As Double) As Double
    I计算_Calculate = a + b
End Function

  ⑵减法

Option Explicit
Implements I计算

Public Function I计算_Calculate(ByVal a As Double, ByVal b As Double) As Double
    I计算_Calculate = a - b
End Function

  ⑶乘法

Option Explicit
Implements I计算

Public Function I计算_Calculate(ByVal a As Double, ByVal b As Double) As Double
    I计算_Calculate = a * b
End Function

  3、根据用户选择采用不同的算法

    Dim CalcMethod As I计算
    Dim value1 As Double
    Dim value2 As Double
    
    ' 根据用户输入的操作符选择不同的算法
    Select Case InputBox("请选择要执行的操作:+ - *")
        Case "+"
            Set CalcMethod = New 加
        Case "-"
            Set CalcMethod = New 减
        Case "*"
            Set CalcMethod = New 乘
        Case Else
            MsgBox "错误选择!"
            Exit Sub
    End Select
    
    ' 输入两个数字
    value1 = CDbl(InputBox("请输入第一个数字:"))
    value2 = CDbl(InputBox("请输入第二个数字:"))
    
    ' 调用计算方法
    MsgBox CalcMethod.Calculate(value1, value2)

  这样,程序就可以根据用户的输入选择而采用不同的计算方法来得到结果。

   上面我们是以策略模式来动态调整算法,也可以使用访问者模式来实现。

  1、定义算法接口

Option Explicit

'定义抽象方法
Public Function Calculate(ByVal x1 As Double, ByVal x2 As Double)

End Function

  2、定义算法实现

  ⑴加法

Option Explicit
Implements I计算

Public Function I计算_Calculate(ByVal x1 As Double, ByVal x2 As Double)
    I计算_Calculate = x1 + x2
End Function

  ⑵减法

Option Explicit
Implements I计算

Public Function I计算_Calculate(ByVal x1 As Double, ByVal x2 As Double)
    I计算_Calculate = x1 - x2
End Function

  ⑶乘法

Option Explicit
Implements I计算

Public Function I计算_Calculate(ByVal x1 As Double, ByVal x2 As Double)
    I计算_Calculate = x1 * x2
End Function

  3、定义数据对象

Private Value1 As Double
Private Value2 As Double
Private Result As Double
Private CalcMethod As I计算

Public Property Get 结果() As String
    结果 = Result
End Property

Public Property Set mCalcMethod(N计算方法 As Object)
    Debug.Print "选择方法"
    CalcMethod = N计算方法
    Result = CalcMethod.Calculate(Value1, Value2)
End Property

Public Property Let mValue1(ByVal a As Double)
    Value1 = a
End Property

Public Property Let mValue2(ByVal a As Double)
    Value2 = a
End Property

Public Property Let mResult(ByVal a As Double)
    Result = a
End Property

Public Function SelectCalc(ByRef N1 As I计算)
    Set CalcMethod = N1
    Result = CalcMethod.Calculate(Value1, Value2)
End Function

  4、测试

Sub test()

    Dim pp As 数据体
    Set pp = New 数据体
    
    Dim ClacMothed  As I计算
    Set ClacMothed = New I计算
    
    Dim N加法 As 加法
    Set N加法 = New 加法
    
    Dim N减法 As 减法
    Set N减法 = New 减法
    
    Dim N乘法 As 乘法
    Set N乘法 = New 乘法
          
    pp.mValue1 = 3
    pp.mValue2 = 21
    '加法
    Set ClacMothed = N加法
    pp.SelectCalc ClacMothed
    Debug.Print pp.结果
    '减法
    Set ClacMothed = N减法
    pp.SelectCalc ClacMothed
    Debug.Print pp.结果
    '乘法
    Set ClacMothed = N乘法
    pp.SelectCalc ClacMothed
    Debug.Print pp.结果
    
End Sub

  实际输出:

24
-18
63  

   就这么简单的两个设计模式,也是折腾了一上午,VBA的语法约束实在是怪异。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值