日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python模板模式_python-模板方法模式

發(fā)布時間:2023/12/3 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python模板模式_python-模板方法模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

說明:

模板方法模式時行為模式中比較簡單的設計模式之一。模板方法關(guān)注這樣的一類行為:該類行為在執(zhí)行過程中擁有大致相同的動作次序,只是動作在實現(xiàn)的具體細節(jié)上有所差異。例如:泡茶和泡咖啡,泡茶:把水煮沸,沸水加入茶葉,把倒進杯子。泡咖啡:把水煮沸,用沸水沖咖啡粉,把咖啡倒進杯子。這樣看來泡茶和泡咖啡的三個步驟基本相似。我們可以報這一類行為抽象成一個算法,并將其中的動作序列按1其先后順序也抽象出來作為該算法的一些步驟。至于這些步驟的實現(xiàn)細節(jié),則有算法的子類去實現(xiàn)。

模板方法模式:定義一個操作中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。

模板方法模式 是一種基于繼承的代碼復用技術(shù) ,將一些復雜流程的實現(xiàn)步驟封裝在一系列基本方法中 ,在抽象父類中提供一個稱之為模板方法的方法來定義這些基本方法的執(zhí)行次序,而通過其子類來覆蓋某些步驟,從而使得相同的算法框架可以有不同的執(zhí)行結(jié)果。

模板方法模式的結(jié)構(gòu)

模板方法模式包含以下兩個角色: AbstractClass(抽象類) ConcreteClass(具體子類)

模板方法模式的實現(xiàn):

模板方法 (Template Method)

基本方法 (Primitive Method) :1、抽象方法(Abstract Method)2、 具體方法(Concrete Method) 3、鉤子方法(Hook Method) :“掛鉤”方法和空方法

實例:

投資股票是種常見的理財方式,我國股民越來越多,實時查詢股票的需求也越來越大。今天,我們通過一個簡單的股票查詢客戶端來認識一種簡單的設計模式:模板模式。

根據(jù)股票代碼來查詢股價分為如下幾個步驟:登錄、設置股票代碼、查詢、展示。

#構(gòu)造如下的虛擬股票查詢器:

classStockQueryDevice():

stock_code="0"stock_price=0.0

deflogin(self,usr,pwd):pass

defsetCode(self,code):

self.stock_code=codedefqueryPrice(self):pass

defshowPrice(self):pass

#根據(jù)不同的查詢機構(gòu)和方式來通過繼承的方式實現(xiàn)其的股票查詢器類。#WebA和WebB的查詢器類可以構(gòu)造如下:

classWebAStockQueryDevice(StockQueryDevice):deflogin(self,usr,pwd):if usr=="myStockA" and pwd=="myPwdA":print "Web A:Login OK... user:%s pwd:%s"%(usr,pwd)returnTrueelse:print "Web A:Login ERROR... user:%s pwd:%s"%(usr,pwd)returnFalsedefqueryPrice(self):print "Web A Querying...code:%s"%self.stock_code

self.stock_price=20.00

defshowPrice(self):print "Web A Stock Price...code:%s price:%s"%(self.stock_code,self.stock_price)classWebBStockQueryDevice(StockQueryDevice):deflogin(self,usr,pwd):if usr=="myStockB" and pwd=="myPwdB":print "Web B:Login OK... user:%s pwd:%s"%(usr,pwd)returnTrueelse:print "Web B:Login ERROR... user:%s pwd:%s"%(usr,pwd)returnFalsedefqueryPrice(self):print "Web B Querying...code:%s"%self.stock_code

self.stock_price=30.00

defshowPrice(self):print "Web B Stock Price...code:%s price:%s"%(self.stock_code,self.stock_price)#在場景中,想要在網(wǎng)站A上查詢股票

if __name__=="__main__":

web_a_query_dev=WebAStockQueryDevice()

web_a_query_dev.login("myStockA","myPwdA")

web_a_query_dev.setCode("12345")

web_a_query_dev.queryPrice()

web_a_query_dev.showPrice()

打印結(jié)果:

Web A:Login OK... user:myStockA pwd:myPwdA

Web A Querying...code:12345

Web A Stock Price...code:12345 price:20.0

但是發(fā)現(xiàn)每次操作,都會調(diào)用登錄,設置代碼,查詢,展示這幾步,是不是有些繁瑣?既然有些繁瑣,何不將這幾步過程封裝成一個接口。由于各個子類中的操作過程基本滿足這個流程,所以這個方法可以寫在父類中。

classStockQueryDevice():

stock_code="0"stock_price=0.0

deflogin(self,usr,pwd):pass

defsetCode(self,code):

self.stock_code=codedefqueryPrice(self):pass

defshowPrice(self):pass

defoperateQuery(self, usr, pwd, code):if notself.login(usr, pwd):returnFalse

self.setCode(code)

self.queryPrice()

self.showPrice()returnTrueclassWebAStockQueryDevice(StockQueryDevice):deflogin(self,usr,pwd):if usr=="myStockA" and pwd=="myPwdA":print("Web A:Login OK... user:%s pwd:%s"%(usr,pwd))returnTrueelse:print("Web A:Login ERROR... user:%s pwd:%s"%(usr,pwd))returnFalsedefqueryPrice(self):print("Web A Querying...code:%s"%self.stock_code)

self.stock_price=20.00

defshowPrice(self):print("Web A Stock Price...code:%s price:%s"%(self.stock_code,self.stock_price))classWebBStockQueryDevice(StockQueryDevice):deflogin(self,usr,pwd):if usr=="myStockB" and pwd=="myPwdB":print("Web B:Login OK... user:%s pwd:%s"%(usr,pwd))returnTrueelse:print("Web B:Login ERROR... user:%s pwd:%s"%(usr,pwd))returnFalsedefqueryPrice(self):print("Web B Querying...code:%s"%self.stock_code)

self.stock_price=30.00

defshowPrice(self):print("Web B Stock Price...code:%s price:%s"%(self.stock_code,self.stock_price))if __name__=="__main__":

web_a_query_dev=WebAStockQueryDevice()

web_a_query_dev.operateQuery("myStockA","myPwdA","12345")

打印結(jié)果相同:

Web A:Login OK... user:myStockA pwd:myPwdA

Web A Querying...code:12345

Web A Stock Price...code:12345 price:20.0

模式優(yōu)點

在父類中形式化地定義一個算法,而由它的子類來實現(xiàn)細節(jié)的處理,在子類實現(xiàn)詳細的處理算法時并不會改變算法中步驟的執(zhí)行次序 。提取了類庫中的公共行為,將公共行為放在父類中,而通過其子類來實現(xiàn)不同的行為。 可實現(xiàn)一種反向控制結(jié)構(gòu),通過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執(zhí)行 更換和增加新的子類很方便,符合單一職責原則和開閉原則

模式缺點

需要為每一個基本方法的不同實現(xiàn)提供一個子類,如果父類中可變的基本方法太多,將會導致類的個數(shù)增加,系統(tǒng)會更加龐大,設計也會更加抽象(可結(jié)合橋接模式)

模式適用環(huán)境

一次性實現(xiàn)一個算法的不變部分,并將可變的行為留給子類來實現(xiàn) 。各子類中公共的行為應被提取出來,并集中到一個公共父類中,以避免代碼重復。 需要通過子類來決定父類算法中某個步驟是否執(zhí)行,實現(xiàn)子類對父類的反向控制

另外:

在模板方法模式中,子類不顯式調(diào)用父類的方法,而是通過覆蓋父類的方法來實現(xiàn)某些具體的業(yè)務邏輯,父類控制對子類的調(diào)用,這種機制被稱為好萊塢原則(Hollywood Principle),好萊塢原則的定義為:“不要給我們打電話,我們會給你打電話(Don‘t call us, we’ll call you)”。在模板方法模式中,好萊塢原則體現(xiàn)在:子類不需要調(diào)用父類,而通過父類來調(diào)用子類,將某些步驟的實現(xiàn)寫在子類中,由父類來控制整個過程。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的python模板模式_python-模板方法模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。