? ?我用了簡(jiǎn)單工廠和建造者模式,與python的GUI配合實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的計(jì)算器系統(tǒng),下面是運(yùn)行結(jié)果,之后會(huì)向大家講解。
類圖如下:
部分代碼如下:
builderModel.py 建造者模式代碼
class
Product
(
)
:
""
"
復(fù)雜產(chǎn)品類
該類用于存放并返回兩個(gè)操作數(shù)
Attributes
:
self
.
NumOne:第一個(gè)操作數(shù)
self
.
NumTwo:第二個(gè)操作數(shù)
""
"
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
(
)
:
""
"
抽象建造者
屬性:兩個(gè)操作數(shù)x,y
方法1:Operation
(
)
抽象方法,對(duì)兩個(gè)操作數(shù)進(jìn)行的操作
方法2:GetResult
(
)
獲得Operation
(
)
運(yùn)算的結(jié)果
""
"
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
)
:
""
"
加法運(yùn)算具體建造者
該類用于進(jìn)行加法運(yùn)算
""
"
def
Operation
(
self
)
:
self
.
result
=
self
.
x
+
self
.
y
class
Sub
(
Builder
)
:
""
"
減法運(yùn)算具體建造者
該類用于進(jìn)行減法運(yùn)算
""
"
def
Operation
(
self
)
:
self
.
result
=
self
.
x
-
self
.
y
class
Mul
(
Builder
)
:
""
"
乘法運(yùn)算具體建造者
該類用于進(jìn)行乘法運(yùn)算
""
"
def
Operation
(
self
)
:
self
.
result
=
self
.
x
*
self
.
y
class
Div
(
Builder
)
:
""
"
除法運(yùn)算具體建造者
該類用于進(jìn)行除法運(yùn)算
""
"
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
:
部分表達(dá)式
:
return
:
結(jié)果
''
'
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行結(jié)果express:'
,
div_express
)
if
len
(
sub_expr2
.
split
(
'+'
)
)
>
1
:
n1
,
n2
=
sub_expr2
.
split
(
'+'
)
my_director
=
Director
(
)
my_add
=
Add
(
float
(
n1
)
,
float
(
n2
)
)
#調(diào)用加法具體建造者
result
=
my_director
.
Construct
(
my_add
)
else
:
n1
,
n2
=
sub_expr2
.
split
(
'-'
)
my_director
=
Director
(
)
my_sub
=
Sub
(
float
(
n1
)
,
float
(
n2
)
)
#調(diào)用減法具體建造者
result
=
my_director
.
Construct
(
my_sub
)
re_sub_expr
=
re
.
sub
(
r
"\-?\d+\.?\d*[\+\-]\d+\.?\d*"
,
str
(
result
)
,
expr
,
count
=
1
)
# 反復(fù)調(diào)用除法
bb
=
com_jiajian
(
str
(
re_sub_expr
)
)
return
bb
def
com_chengchu
(
expr_div
)
:
''
'
:
param expr_div
:
部分表達(dá)式
:
return
:
結(jié)果
''
'
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
:
#只計(jì)算乘除,加減直接pass,放入加減函數(shù)執(zhí)行
pass
re_sub_expr
=
re
.
sub
(
r
"\d+\.?\d*[\/\*]\-?\d+\.?\d*"
,
str
(
result
)
,
expr
,
count
=
1
)
#反復(fù)調(diào)用除法
bb
=
com_chengchu
(
format_mark
(
re_sub_expr
)
)
return
bb
main.py 簡(jiǎn)單工廠模式
class
MyMath
(
)
:
""
"
抽象產(chǎn)品角色
""
"
@abc
.
abstractmethod
def
mathShow
(
self
)
:
pass
def
GetResult
(
self
)
:
pass
class
everyMath
(
MyMath
)
:
""
"
具體產(chǎn)品角色
""
"
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
運(yùn)行結(jié)果如下:
(1)主界面
(2)注冊(cè)
(3)注冊(cè)成功時(shí)
(4)登錄密碼錯(cuò)誤時(shí)
(5)登錄成功時(shí)
(6)math函數(shù)調(diào)用
只要是有一個(gè)參數(shù)的math函數(shù)都可以:
換一些其他函數(shù):
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
