可能会写成这样:
/// w ##class(PHA.YX.Design.Program).GetResult()
ClassMethod GetResult()
{
READ "输入第一个数字:", numberA,!
READ "输入操作符:", operate,!
READ "输入第二个数字:", numberB,!
s result = ""
i operate = "+" d
.s result = numberA + numberB
i operate = "-" d
.s result = numberA - numberB
i operate = "*" d
.s result = numberA * numberB
i operate = "/" d
.s result = numberA / numberB
q result
}
缺点:
if表达式每次都需要判断,等于计算机做了三次无用功。 如果除法,输入了0,除法会报错。DHC-APP> w ##class(PHA.YX.Design.Program).GetResult()
输入第一个数字:1
输入操作符:/
输入第二个数字:1.5
.6666666666666666667
DHC-APP> w ##class(PHA.YX.Design.Program).GetResult()
输入第一个数字:1
输入操作符:/
输入第二个数字:0
.s result = numberA / numberB
^
zGetResult+12^PHA.YX.Design.Program.1
如果改成swtich($case)
可能会写成这样:
/// w ##class(PHA.YX.Design.Program).GetResultCase()
ClassMethod GetResultCase()
{
READ "输入第一个数字:", numberA,!
READ "输入操作符:", operate,!
READ "输入第二个数字:", numberB,!
s result= $case(operate,
"+" : numberA + numberB,
"-" : numberA + numberB,
"*" : numberA + numberB,
"/" : numberA + numberB)
q result
}
缺点:
如果加减乘除方法非常大,每次修改其中一个都会编译其他三个运算方法。 增加错误修改,可能日后修改代码修改错。 结构图 完整示例 利用面相对象的继承和多态。 增加一个幂次运算。 由此例子举一反三。 改修运算,只需要去对应的类去修改就好了。只编译对应的类。 注意 Operation类的numberA,numberB为私有字段属性,其他类无法调用。InitialExpression设置初始值。 Operation类的numberA,numberB字段,Get,Set方法中的属性,要用i%property,否则报出递归错误。 Operation类GetResult()为抽象方法,子类需要重新实现。 Program类SimpleFactory()方法,要显示生命oper类型,否则无法用“.”语法。 OperationFactory类返回的是Operation类对象,这里及是多态。 其他操作类均为继承类Operation类的子类,重写Operation类GetResult()方法。 调用Class PHA.YX.Design.Program Extends %RegisteredObject
{
/// w ##class(PHA.YX.Design.Program).SimpleFactory()
ClassMethod SimpleFactory()
{
READ "输入第一个数字:", numberA,!
READ "输入操作符:", operate,!
READ "输入第二个数字:", numberB,!
# dim oper as PHA.YX.Design.SimpleFactory.Operation
s oper = ##class(PHA.YX.Design.SimpleFactory.OperationFactory).CreateOperate(operate)
d oper.numberASet(numberA)
d oper.numberBSet(numberB)
s result = oper.GetResult()
q result
}
}
输出
DHC-APP>w ##class(PHA.YX.Design.Program).SimpleFactory()
输入第一个数字:1
输入操作符:+
输入第二个数字:1
2
DHC-APP>w ##class(PHA.YX.Design.Program).SimpleFactory()
输入第一个数字:2
输入操作符:-
输入第二个数字:3
-1
DHC-APP>w ##class(PHA.YX.Design.Program).SimpleFactory()
输入第一个数字:6
输入操作符:*
输入第二个数字:3
18
DHC-APP>w ##class(PHA.YX.Design.Program).SimpleFactory()
输入第一个数字:1
输入操作符:/
输入第二个数字:1.5
0.6666666666666666667
DHC-APP>w ##class(PHA.YX.Design.Program).SimpleFactory()
输入第一个数字:1
输入操作符:/
输入第二个数字:0
除数不能为0。
DHC-APP>w ##class(PHA.YX.Design.Program).SimpleFactory()
输入第一个数字:3
输入操作符:**
输入第二个数字:3
27
工厂类
Class PHA.YX.Design.SimpleFactory.OperationFactory Extends %RegisteredObject
{
ClassMethod CreateOperate(operate As %String) As Operation
{
# dim oper as PHA.YX.Design.SimpleFactory.Operation
s oper = $case(operate,
"+" : ##class(PHA.YX.Design.SimpleFactory.OperationAdd).%New(),
"-" : ##class(PHA.YX.Design.SimpleFactory.OperationSub).%New(),
"*" : ##class(PHA.YX.Design.SimpleFactory.OperationMul).%New(),
"/" : ##class(PHA.YX.Design.SimpleFactory.OperationDiv).%New(),
"**" : ##class(PHA.YX.Design.SimpleFactory.OperationIndex).%New())
q oper
}
}
运算类
Class PHA.YX.Design.SimpleFactory.Operation Extends %RegisteredObject
{
Property numberA As %Decimal [ InitialExpression = 0, Private ];
Method numberAGet() As %String [ ServerOnly = 1 ]
{
Quit i%numberA
}
Method numberASet(Arg As %String) As %Status [ ServerOnly = 1 ]
{
s i%numberA = Arg
Quit $$$OK
}
Property numberB As %Decimal [ InitialExpression = 0, Private ];
Method numberBGet() As %String [ ServerOnly = 1 ]
{
Quit i%numberB
}
Method numberBSet(Arg As %String) As %Status [ ServerOnly = 1 ]
{
s i%numberB = Arg
Quit $$$OK
}
Method GetResult() [ Abstract ]
{
s result = 0
q result
}
}
加法类
Class PHA.YX.Design.SimpleFactory.OperationAdd Extends PHA.YX.Design.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
s reulst = ..numberAGet() + ..numberBGet()
q reulst
}
}
减法类
Class PHA.YX.Design.SimpleFactory.OperationSub Extends PHA.YX.Design.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
s reulst = ..numberAGet() - ..numberBGet()
q reulst
}
}
乘法类
Class PHA.YX.Design.SimpleFactory.OperationMul Extends PHA.YX.Design.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
s reulst = ..numberAGet() * ..numberBGet()
q reulst
}
}
除法类
Class PHA.YX.Design.SimpleFactory.OperationDiv Extends PHA.YX.Design.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
q:..numberBGet()=0 "除数不能为0。"
s reulst = ..numberAGet() / ..numberBGet()
q reulst
}
}
指数类
Class PHA.YX.Design.SimpleFactory.OperationIndex Extends PHA.YX.Design.SimpleFactory.Operation
{
Method GetResult()
{
s reulst = 0
s reulst = ..numberAGet() ** ..numberBGet()
q reulst
}
}
思考
厂家可以生产各种品牌电脑,例如hp,lenovo,asus等品牌。简单工厂模式如何实现。感兴趣的同学实现后可以发我一起参考下。