admin管理员组

文章数量:1029753

设计模式:建造者设计模式(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设计模式

设计模式:建造者设计模式(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设计模式

本文标签: 设计模式建造者设计模式(Builder)(2)