? ?我用了簡單工廠和建造者模式,與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函數都可以:
換一些其他函數:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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