一、单例模式(Singleton Pattern)
'------------------------------------------------------------------------------- ' Description: ' 单例模式Singleton Pattern ' 只能实例化一个对象。当创建ExcelWrapper这个类包装的时候就只会调用单个实例,在类销毁时, ' 会自动销毁此全局变量的实例,这样就再也不会在进程里看到N多个Excel进程实例了。 '------------------------------------------------------------------------------- Option Explicit Public oExcel '声明全局变量 Dim oExcelInstace Class ExcelWrapper Private oExcelObject '初始化类 Private Sub Class_Initialize() Dim bAleadyInit '判断对象是否存在的标志位 bAleadyInit=False '检查对象是否已经被初始化 If IsObject(oExcel)=True Then '对象初始化 If Not oExcel Is Nothing Then bAleadyInit=True '激活状态 End If End If '如果标志位是False,则创建一个实例对象 If bAleadyInit=False Then Set oExcel=CreateObject("Excel.Application") End If Set oExcelObject=oExcel End Sub '类销毁时退出Excel,并且释放Excel对象引用 Private Sub Class_Terminate() oExcelObject.Quit Set oExcelObject=Nothing End Sub Public Sub Open(oFileName) '写入打开文件代码 End Sub Public Function GetSheetData(oSheet) '写读取单元格代码 End Function End Class Set oExcelInstace=New ExcelWrapper oExcelInstace.Open("")
二、工厂模式(Factory Pattern)
'------------------------------------------------------------------------------- ' Description: ' 工厂模式Factory Pattern ' 一种创建模式,可用于创建和初始化某个对象。通过工厂的核心来创建、存储、管理需要的输出机制, ' 并利用关键字请求进行对象输出,是测试设计中非常重要的设计模式。 '------------------------------------------------------------------------------- Option Explicit Public oOutputs Set oOutputs=New OutFactory Class OutFactory Public Channels '定义变量 Private Sub Class_Initialize Set Me.Channels=CreateObject("Scripting.Dictionary") End Sub Private Sub Class_Terminate Set Me.Channels=Nothing End Sub Public Sub Construct(sChannelName, sChannelType) Dim oNewChannel Select Case sChannelType Case "excel" '创建一个Excel的Singleton类 Set oNewChannel=New ExcelWrapper Case "fso" '创建一个FSO的Singleton类 Set oNewChannel=New fsoWrapper Case "DB" '创建一个ADO的Singleton类 Set oNewChannel=New DBWrapper End Select '把类都存储起来 Me.Channels.Add sChannelName, oNewChannel End Sub End Class '构造方法 oOutputs.Construct "excel_instance", "excel" oOutputs.Construct "fso_instance", "fso") oOutputs.Construct "DB_instance", "DB") '直接取我们需要的东西,并进行操作 oOutputs.Channels("excel_instance").whatever '此处的Whatever是Excel的Singleton类中的自定义方法
三、命令包装模式(Command Pattern)
'-------------------------------------------------------------------------------
' Description:
' 命令包装模式Command Pattern
' 把一个请求或者操作封装到一个对象中。该模式运行系统使用不同的请求把客户端参数化,对请求排队或者记录
' 请求日志,可以提供命令的撤销和恢复功能。是一种将函数命令包装成一个类对象的模式,在运行时实例化一个类获取实
' 例化对象,并使实例化对象获得一个函数的引用。首先需要先定义一个完整类,在类中封装一个Default函数,这样当在
' 调用创建此类时即可把Default函数的指针指向新建的那个对象类。
'-------------------------------------------------------------------------------
Option Explicit
Class oCommand
'定义输入
Private VarIntNum
Public Property Get Number
Number = VarIntNum
End Property
Public Property Let Number(ByVal oNum)
VarIntNum = oNum
End Property
'定义输出
Private VarResult
Public Property Get Result
Result = VarResult
End Property
Public Property Let Result(ByVal oResult)
VarResult = oResult
End Property
'默认主函数
Public Default Function Exec()
Me.Result=Number * Number
Exec=Me.Result
End Function
End Class
'构造一个构造器
Function Constructor(ByVal newNumber)
Set Constructor = New oCommand
Constructor.Number = newNumber
End Function
'调用构造器并输入参数
Dim con1
Set con1 = Constructor(3)
'命令模式
Call con1
'获取命令执行结果
MsgBox con1.Result
四、回调设计模式(CallBack Pattern)
'-------------------------------------------------------------------------------
' Description:
' 回调设计模式CallBack Pattern
' 主要用于一个模块执行完毕后,脚本自身会去回调一个所需要执行的代码块,一种非常实用的设计模式。
' 主要的出发点还是依靠类的销毁化函数引申出来的。要做到通用性的回调设计类,只需要在类中加入Execute反射
' 即可。
'-------------------------------------------------------------------------------
Option Explicit
Class Callback
'回调的动态脚本
Dim CallBackScript
'类的销毁化
Public Sub Class_Terminate()
Execute CallBackScript
End Sub
End Class
'定义回调变量
Dim cb
Set cb=New Callback
cb.CallBackScript="call msg()"
Function msg()
MsgBox "callback scriptiong"
End Function
MsgBox "script end"
五、函数指针模式(Function Pointer Pattern)
'-------------------------------------------------------------------------------
' Description:
' 函数指针模式Function Pointer Pattern
' 就是指向函数的指针变量。Function相当于一个测试模块,当需要添加或者删除模块时,只需要
' 在调用时更改LoadFunc数组即可,无需改动核心脚本的代码逻辑,这种模式在自动化测试中经常被用到的
' 控制测试流的技术手段。
'-------------------------------------------------------------------------------
Option Explicit
'函数tt1
Public Function tt1()
MsgBox "tt1"
End Function
'函数tt2
Public Function tt2()
MsgBox "tt2"
End Function
'函数tt3
Public Function tt3()
MsgBox "tt3"
End Function
'建立测试流函数
Public Function TestFlow(LoadFuncs)
Dim CallFunc,i
'遍历所有载入的函数名,并利用函数指针进行调用
For i=0 To UBound(LoadFuncs)-LBound(LoadFuncs)
'将CallFunc的指针指向动态载入的函数
Set CallFunc=GetRef(LoadFuncs(i))
'调用指针
Call CallFunc
Next
End Function
'调用测试流
Call TestFlow(Array("tt1","tt2"))
六、类的继承模式(Extends Pattern)
'-------------------------------------------------------------------------------
' Description:
' 类的继承模式Extends Pattern
' VBScript本身完全不支持类的继承,但通过后期的脚本处理技巧,使用一些取巧的方式来变相实现这些设计模式。
'-------------------------------------------------------------------------------
Option Explicit
'创建一个继承类库
Class ClassHelper
Private dict
'添加默认方法
Public Default Function addMethod(name)
Set dict(name)=GetRef(dict("type") & name)
End Function
'创建字典对象
Private Function createDict()
Set createDict=CreateObject("Scripting.Dictionary")
End Function
'复制字典对象
Private Function copyDict(super, child)
Dim key
For Each key In super
If IsObject(super(key)) Then
Set child(key)=super(key)
Else
child(key)=super(key)
End If
Next
Set copyDict=child
End Function
'新建一个类
Public Function newClass(name)
Set dict=createDict()
dict("type")=name
Set newClass=dict
End Function
'继承方法
Public Function extends(super, childType)
Set dict=copyDict(super, createDict())
Set dict("parent")=super
dict("type")=childType
Set extends=dict
End Function
'新建继承类
Public Function [new](super, arrParams)
Dim dict : Set dict=copyDict(super, createDict())
Call dict("initialize")(dict, arrParams)
Set [new]=dict
End Function
End Class
'载入继承帮助类
Dim Mercury : Set Mercury=New ClassHelper
'创建一个AutoTestTools新类
'START NEW ClassHelper
Dim AutoTestTools
Set AutoTestTools=Mercury.newClass("AutoTestTools")
AutoTestTools("effect")="Automation Testing"
Public Function AutoTestToolsInitialize(this, arrParams)
this("effect")=arrParams(0)
End Function : Mercury "initialize"
Public Function AutoTestToolsLaunch()
MsgBox "Launch AutoTestTools"
End Function : Mercury "Launch"
'END CLASS
'创建一个新继承AutoTestTools的类
'START NEW CLASS
Dim QuickTest
Set QuickTest=Mercury.extends(AutoTestTools, "QuickTest")
QuickTest("name")="QuickTest Professional"
QuickTest("support")="all"
Public Function QuickTestInitialize(this, arrParams)
this("support")=arrParams(0)
End Function : Mercury "initialize"
Public Function QuickTestLaunch()
MsgBox "Launch QuickTest"
End Function : Mercury "Launch"
'END CLASS
'初始化QuickTest类
Dim QuickTestCls : Set QuickTestCls=Mercury.[new](QuickTest, Array("web"))
'打印support属性,此时已经被初始化为Web
MsgBox QuickTestCls("support")
'执行QuickTest类中的Launch方法
Call QuickTestCls("Launch")()
'执行QuickTest类的父类的Launch方法
Call QuickTestCls("parent")("Launch")()