设计模式:建造者设计模式(Builder)(2)
关于该设计模式在 VFP 中的应用示例,我考虑了很久。最终决定以主程序的伪代码来做。它至少有两个作用:
1. 通过“主程序”这个过程化代码的重灾区的改造,体会 OOP 的设计思想;
2. 通过主程序的演变说明该模式的特点。
一个最简单的主程序,基本上需要完成以下功能:环境设置、路径设置、启动主UI。而在实际应用中,可能需要提供试用版、标准版和定制版。
因此,生成器接口(模板)可以这样来定义:
代码语言:javascript代码运行次数:0运行复制Define Class IBuilder As Custom
*** <summary>
*** 环境初始化
*** </summary>
Procedure EnvInit()
*!* 由具体生成器实现方法代码
Endproc
*** <summary>
*** 启动主UI
*** </summary>
Procedure StartUI()
*!* 由具体生成器实现方法代码
Endproc
*** <summary>
*** 添加试用限制模块
*** </summary>
Procedure TrialModule()
*!* 由具体生成器实现方法代码
Endproc
*** <summary>
*** 添加定制模块
*** </summary>
Procedure CustomModule()
*!* 由具体生成器实现方法代码
Endproc
Enddefine
那么具体的生成器大概就是以下的定义:
代码语言:javascript代码运行次数:0运行复制Define Class Builder As IBuilder
oApp = .Null.
Procedure EnvInit()
With This.oApp As myApp
.SetEnv()
.SetPath()
Endwith
Endproc
Procedure StartUI()
This.oApp.StartUI()
Endproc
Procedure TrialModule()
This.oApp.TrialModule()
Endproc
Procedure CustomModule()
This.oApp.CustomModule()
Endproc
*** <summary>
*** 重置 oApp 属性
*** </summary>
Procedure Reset()
This.oApp = .Null.
Endproc
*** <summary>
*** 从具体生成器获取最终的产品
*** </summary>
Procedure GetProduct() As myApp
Local myApp As myApp
m.myApp = This.oApp
This.Reset()
Return m.myApp
Endproc
Enddefine
作为产品类的 myApp 类定义大概是这样:
代码语言:javascript代码运行次数:0运行复制Define Class myApp As Custom
*** <summary>
*** 应用程序类的类型:-1:试用版;0: 标准版;1: 定制版
*** </summary>
nType = 0
*** <summary>
*** 环境设置
*** </summary>
Procedure SetEnv()
Set Ansi On
*** 其他环境设置命令
Endproc
*** <summary>
*** 路径设置
*** </summary>
Procedure SetPath()
Set Default To (Addbs(Sys(5) + Sys(2003)))
Set Path To ".\Report;.\Data"
Endproc
*** <summary>
*** 启动主UI
*** </summary>
Procedure StartUI()
With _Screen
.Visible = .T.
.WindowState = 2
EndWith
Do MainMenu.mpr
Endproc
*** <summary>
*** 添加试用限制模块
*** </summary>
Procedure TrialModule()
*!* 试用限制模块的添加命令
This.nType = -1
Endproc
*** <summary>
*** 添加定制模块
*** </summary>
Procedure CustomModule()
*!* 定制模块的添加命令
This.nType = 1
Endproc
Enddefine
到这里,我们就可以定义指挥者:
代码语言:javascript代码运行次数:0运行复制Define Class Director As Custom
oBuilder = .Null.
*** <summary>
*** 试用版
*** </summary>
Procedure Trial()
With This.oBuilder As Builder
.EnvInit()
.TrialModule()
.StartUI()
EndWith
Endproc
*** <summary>
*** 标准版
*** </summary>
Procedure Standard()
With This.oBuilder As Builder
.EnvInit()
.StartUI()
EndWith
Endproc
*** <summary>
*** 定制版
*** </summary>
Procedure Custom()
With This.oBuilder As Builder
.EnvInit()
.CustomModule()
.StartUI()
EndWith
Endproc
Enddefine
OK,现在可以写出我们的主程序 main.prg 了:
代码语言:javascript代码运行次数:0运行复制Local loDirector As Director, loBuilder As Builder, lomyApp As myAPP
m.loDirector = Createobject("Director")
m.loBuilder = Createobject("Builder")
m.lomyApp = Createobject("myApp")
m.loBuilder.oApp = m.lomyApp
m.loDirector.oBuilder = m.loBuilder
*!* 标准版
m.loDirector.Standard()
*!* *!* 试用版
*!* m.loDirector.Trial()
*!* *!* 定制版
*!* m.loDirector.Custom()
_Screen.AddProperty("myAPP", m.loDirector.oBuilder.GetProduct())
Read Events
"啊......好复杂啊......"
“它也许是创建型设计模式中最灵活最复杂的设计模式”
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-19,如有侵权请联系 cloudcommunity@tencent 删除builderproceduresummarythis设计模式发布者:admin,转转请注明出处:http://www.yc00.com/web/1747614073a4670641.html
评论列表(0条)