原文取自大話設計模式,不同之處在於原文是基於c#編寫的,我在這裡用python表述
需求:使用python語言開發實現2個數相加減及擴充套件的計算器
初學者**如下:
if __name__ == "__main__":
print("請輸入數字a:")
a = input()
print("請輸入數字b:")
b = input()
print("請輸入運算子:")
c = input()
if (c == "+"):
print(int(a) + int(b))
elif (c == "-"):
print(a - b)
elif (c == "*"):
print(a * b)
else:
print(a / b)
注意,python無法使用switch語句。
上述**的缺點,如果要新增其他運算方式或修改已有的運算方式,那麼每次修改都要在上述的elif語句裡面新增新的條件或修改已有的**,完全不具備擴充套件性和維護性。(哪怕將上述的非核心**封裝到某個方法中,依然如此)
對上述**進行修改:
首先引入包:
import abc
然後提取上述需求中不改變的東西為基類:
這裡定義a,b為operation類的兩個類變數
# 定義運算類
# python的抽象方法必須含有至少乙個引數,預設使用self函式
# 子類使用父類變數是,必須通過self物件、等同於this
class operation():
a = 0
b = 0
@abc.abstractmethod
def getresult(self):
pass
定義乙個獲取結果的getresult方法,且該方法是抽象方法。
使用@abc.abstractmethod宣告的方法為抽象方法,該方法需要其繼承類重新改寫
然後定義上述基類的實現類(主要是實現上述類的抽象方法),即對基類進行擴充套件改造:
# 運算類的實現類-加運算
class operationadd(operation):
def getresult(self):
print(int(self.a) + int(self.b))
# 運算類的實現類-減運算
class operationsub(operation):
def getresult(self):
print(int(self.a) - int(self.b))
# #############################
# 可以繼續新增其他運算類的實現類
# #############################
定義運算工廠類,用來獲取實現類:
# 運算工廠類
class operationfactory():
# 運算類的靜態方法
@staticmethod
def createoperation(operation):
opera = none
# 這裡可以新增其他運算方法
if (operation == "+"):
opera = operationadd()
elif (operation == "-"):
opera = operationsub()
elif (operation == "*"):
pass
else:
pass
return opera
最後就是主函式:
if __name__ == "__main__":
print("請輸入數字a:")
a = input()
print("請輸入數字b:")
b = input()
print("請輸入運算子:")
c = input()
opera = operationfactory.createoperation(c)
opera.a = a
opera.b = b
opera.getresult()
在主函式中,operationfactory.createoperation方法可以根據你的輸入,獲取指定的運算物件。
然後通過指定的運算物件,呼叫其getresult()方法就可以獲取該類特有的運算結果。
優點:無論新增多少新的運算方式,只要使其重寫基類的抽象函式,再在工廠類中新增相應的分支**,就可以獲取該類的特有運算結果。
缺點:新增新的運算類需要修改工廠方法,每次新增,工廠類都要重新打包編譯。
總結:#乙個實體類(包含抽象方法),實體類的實現類 (擴充套件類)
# 乙個工廠類(用來根據不同需求例項化不同實現類)、
# 乙個主函式
# 即通過工廠類獲取【基類的實現類】,然後呼叫【基類的實現類】的特定抽象方法,獲取對應結果
編碼中的小發現:
# 說起來python的類變數、突然想起來ptyhon中是否含有類的靜態變數這個東西。
# 然後就敲了下面的**使其和c#**進行對比。
# 對比發現,python和c#的一點點不同,python類裡面定義的變數,如果通過類名去改變,則所有的例項物件的變數都會受到影響。
# class demo():
# a=10
# if __name__ == "__main__":
# demob = demo()
# demob.a = 1
# demo.a = 100
# demoa = demo()
# demob = demo()
# print(demoa.a, demob.a)
# 這裡輸出100,100
# if __name__ == "__main__":
## demoa=demo()
# demoa.a=100
# demob=demo()
# print(demoa.a,demob.a)
# 這裡輸出100,10
不對之處敬請指正! python開發中常用的設計模式(開放 封閉原則)
原文取自大話設計模式,我這裡將其長話短說。開放封閉原則 對於擴充套件是開放的,對於更改是封閉的。作為程式設計師,進行軟體開發時,不要指望需求不會變更,而是要考慮需求改變時如何不讓 推倒重來。上面的更改指的是我們開發中建立的類 模組 函式等。進行軟體開發設計時,要預先猜測出可能的更改,將其可變化的 抽...
遊戲開發中常用的設計模式
使用設計模式來提高程式庫的重複利用性是大型程式專案開發必須的。但是在 四人幫 的設計模式概述中提到了23種標準設計模式,不但難以記住,而且有些設計模式更多的適用於應用程式開發,對遊戲專案引擎設計並沒有很多的利用價值。根據經驗,精挑細選後,篤志在這裡記錄一些自認為有利用價值的設計模式,以便之後自己設計...
iOS開發中常用的幾種設計模式
1.mvc 模型,檢視,控制器,對應是的資料的儲存或處理,前台的顯示,業務邏輯的控制。2.單例模式 不通過alloc建立物件,而是用乙個靜態的方法返回這個類的物件,系統只擁有乙個這個類的全域性物件 3.工廠模式 4.委託模式 物件本身沒有能力或不方便實現某項功能,而委託其他的物件去完成,其核心 id...