模板方法模式:定義一個工作流或算法的基本骨架,而將一些特定步驟的實現延遲到子類中。
模板方法模式是面向對象編程實踐中最容易總結出來的模式,即使一開始不知道什么叫設計模式,可能經常都已經用到了這種模式:
class Daili(object): def __init__(self,daili_name): self.daili_name = daili_name def extract(self): """從網站提取代理ip""" pass ##由子類返回代理ip的列表 def check_daili(self, daili_list): print '檢測 ' +self.daili_name + ' 代理,保存其中的可用的代理到redis' def collect_daili(self): daili_list = self.extract() self.check_daili(daili_list) class XiciDaili(Daili): def extract(self): '''從希刺代理提取ip''' print '正在提取 ' + self.daili_name + ' 網站的代理' return ['some ip'] class YaoYaoDaili(Daili): def extract(self): '''從瑤瑤代理網站提取ip''' print '正在提取 ' + self.daili_name + ' 網站的代理' return ['some ip'] # XiciDaili('希刺').collect_daili() YaoYaoDaili('瑤瑤').collect_daili()
實現代理ip采集,可能一開始只寫xici代理提取,但是后來又寫yaoyao代理提取。
但兩個類,只有提取ip的正則或者css選擇器寫法不同,其他的檢測ip可用性和保存代理到redis,都是相同的。
所以使用模板模式非常方便,不管再怎么采集其他各種網站的代理,只需要新寫自己的提取方法就可以,其余的檢測和保存則無需重復復制粘貼。
2、模板模式用在業務流程中也是十分方便十分常見的,子類只需要繼承重寫很少一部分,骨架在模板類,要是修改基礎東西,直接去修改模板類就可以,一次修改到處生效。如果使用模塊加函數編程,需要修改幾十上百個文件批量修改。
oop不是只能用在基礎共用類,業務流程類中也適合。
3、模板模式和策略模式可以互相替換。
如果把上面代碼稱為投,下面代碼稱為腳,模板模式一般是頭重腳輕,策略模式頭輕腳重。這是一般情況。子類只需要重寫少數方法,也有的是父類暴露出非常多的抽象方法,而僅有少數實體運行代碼。
一種先寫個大模板類,然后所有子類去重寫某個方法。
一種是寫很多個策略類,然后用一個類去組合這些類,調用策略類的方法。
一種是寫很多個策略類,然后用一個類去組合這些類,調用策略類的方法。
模板模式 1模板父類 + n子類
策略模式 n策略類 + 1個使用策略的類