我用了简单工厂和建造者模式,与python的GUI配合实现了一个简单的计算器系统,下面是运行结果,之后会向大家讲解。
类图如下:
部分代码如下:
builderModel.py 建造者模式代码
class
Product
(
)
:
""
"
复杂产品类
该类用于存放并返回两个操作数
Attributes
:
self
.
NumOne:第一个操作数
self
.
NumTwo:第二个操作数
""
"
def
__init__
(
self
,
NumOne
,
NumTwo
)
:
self
.
__NumOne
=
NumOne #伪私有
self
.
__NumTwo
=
NumTwo
def
getNumOne
(
self
)
:
return
self
.
__NumOne
def
getNumTwo
(
self
)
:
return
self
.
__NumTwo
class
Builder
(
)
:
""
"
抽象建造者
属性:两个操作数x,y
方法1:Operation
(
)
抽象方法,对两个操作数进行的操作
方法2:GetResult
(
)
获得Operation
(
)
运算的结果
""
"
def
__init__
(
self
,
x
,
y
)
:
self
.
x
=
x
self
.
y
=
y
self
.
result
=
0
@abc
.
abstractmethod
def
Operation
(
self
)
:
pass
def
GetResult
(
self
)
:
return
self
.
result
class
Add
(
Builder
)
:
""
"
加法运算具体建造者
该类用于进行加法运算
""
"
def
Operation
(
self
)
:
self
.
result
=
self
.
x
+
self
.
y
class
Sub
(
Builder
)
:
""
"
减法运算具体建造者
该类用于进行减法运算
""
"
def
Operation
(
self
)
:
self
.
result
=
self
.
x
-
self
.
y
class
Mul
(
Builder
)
:
""
"
乘法运算具体建造者
该类用于进行乘法运算
""
"
def
Operation
(
self
)
:
self
.
result
=
self
.
x
*
self
.
y
class
Div
(
Builder
)
:
""
"
除法运算具体建造者
该类用于进行除法运算
""
"
def
Operation
(
self
)
:
try
:
self
.
result
=
self
.
x
/
self
.
y
except ZeroDivisionError
:
self
.
result
=
None
class
Director
(
)
:
""
"
指挥者类
""
"
def
Construct
(
self
,
builder
)
:
product
=
Product
(
0
,
0
)
builder
.
Operation
(
)
product
=
builder
.
GetResult
(
)
return
product
def
com_jiajian
(
express
)
:
''
'
:
param express
:
部分表达式
:
return
:
结果
''
'
expr
=
express
sub_expr
=
re
.
search
(
r
"\-?\d+\.?\d*[\+\-]\d+\.?\d*"
,
expr
)
if
not sub_expr
:
return
expr
else
:
sub_expr2
=
sub_expr
.
group
(
)
#
print
(
'sub_expr1'
,
sub_expr1
,
'19行结果express:'
,
div_express
)
if
len
(
sub_expr2
.
split
(
'+'
)
)
>
1
:
n1
,
n2
=
sub_expr2
.
split
(
'+'
)
my_director
=
Director
(
)
my_add
=
Add
(
float
(
n1
)
,
float
(
n2
)
)
#调用加法具体建造者
result
=
my_director
.
Construct
(
my_add
)
else
:
n1
,
n2
=
sub_expr2
.
split
(
'-'
)
my_director
=
Director
(
)
my_sub
=
Sub
(
float
(
n1
)
,
float
(
n2
)
)
#调用减法具体建造者
result
=
my_director
.
Construct
(
my_sub
)
re_sub_expr
=
re
.
sub
(
r
"\-?\d+\.?\d*[\+\-]\d+\.?\d*"
,
str
(
result
)
,
expr
,
count
=
1
)
# 反复调用除法
bb
=
com_jiajian
(
str
(
re_sub_expr
)
)
return
bb
def
com_chengchu
(
expr_div
)
:
''
'
:
param expr_div
:
部分表达式
:
return
:
结果
''
'
expr
=
expr_div
sub_expr
=
re
.
search
(
r
"\d+\.?\d*[\/\*]\-?\d+\.?\d*"
,
expr
)
if
not sub_expr
:
return
expr
else
:
sub_expr2
=
sub_expr
.
group
(
)
if
len
(
sub_expr2
.
split
(
'/'
)
)
>
1
:
n1
,
n2
=
sub_expr2
.
split
(
'/'
)
my_director
=
Director
(
)
my_div
=
Div
(
float
(
n1
)
,
float
(
n2
)
)
result
=
my_director
.
Construct
(
my_div
)
if
len
(
sub_expr2
.
split
(
'*'
)
)
>
1
:
n1
,
n2
=
sub_expr2
.
split
(
'*'
)
my_director
=
Director
(
)
my_mul
=
Mul
(
float
(
n1
)
,
float
(
n2
)
)
result
=
my_director
.
Construct
(
my_mul
)
else
:
#只计算乘除,加减直接pass,放入加减函数执行
pass
re_sub_expr
=
re
.
sub
(
r
"\d+\.?\d*[\/\*]\-?\d+\.?\d*"
,
str
(
result
)
,
expr
,
count
=
1
)
#反复调用除法
bb
=
com_chengchu
(
format_mark
(
re_sub_expr
)
)
return
bb
main.py 简单工厂模式
class
MyMath
(
)
:
""
"
抽象产品角色
""
"
@abc
.
abstractmethod
def
mathShow
(
self
)
:
pass
def
GetResult
(
self
)
:
pass
class
everyMath
(
MyMath
)
:
""
"
具体产品角色
""
"
def
__init__
(
self
,
string
,
num
)
:
self
.
string
=
str
(
string
)
self
.
num
=
num
def
mathShow
(
self
)
:
return
eval
(
self
.
string
)
(
self
.
num
)
class
mathFactory
(
)
:
""
"
工厂角色类
""
"
def
__init__
(
self
,
string
,
num
)
:
self
.
string
=
string
self
.
num
=
num
def
getMath
(
self
)
:
math
=
MyMath
(
)
math
=
everyMath
(
self
.
string
,
self
.
num
)
return
math
运行结果如下:
(1)主界面
(2)注册
(3)注册成功时
(4)登录密码错误时
(5)登录成功时
(6)math函数调用
只要是有一个参数的math函数都可以:
换一些其他函数: