在物件導向系統的分析與設計過程中經常會遇到這樣一種情況: 乙個流程可以分為a,b,c….多個步驟,但在具體的步驟中可能會有不同的情況出現,這時就template模式就非常有用:
class
p(object):
defa
():pass
defb
():pass
defoperate
(): a()
b()class
sub(p):
defa
():print
'a in sub'
defb
():print
'b in sub'
class
suba
(p):
defa
():print
'a in suba'
defb
():print
'b in suba'
也就是說在父類中定義流程的細節,步驟的介面,在子類中無需管流程的細節,只要實現步驟的細節即可以滿足功能的需求了。
最近做的乙個flask專案就用到了template模式,在route中接受到的post請求需要驗證,而wtf已經提供了一些基本格式的驗證,這時想把一些功能上的驗證也做到裡面去,不討論這麼做是不是符合物件導向的一些原則,在這個專案中很方便也不會有問題就好!於是新建了乙個類:
class
agentform
(form):
status = 0
msg = ''
domain = ''
user_id = ''
defset_domain
(self, domain):
self.domain = domain
defset_user_id
(self, user_id):
self.user_id = user_id
defvalidate_logic
(self):
return
true
defvalidate
(self):
if self.validate_logic(): # subclass validation is ok, run the basic validation for format
ifnot super(agentform, self).validate():
self.status = format_validation_failed_ret
errors = deepcopy(self.errors)
if'csrf_token'
in errors:
del errors['csrf_token']
for value in errors.itervalues():
self.msg += string.join(value, sep=' ')
self.msg += '\n'
self.msg = self.msg[0:len(self.msg)-1]
# self.msg = str(self.errors)
return
false
return
true
return
false
這個類的目的在於將wtf本身的驗證資訊返回到成員變數status,msg裡面來,方便呼叫者獲取。同時提供validate_logic函式介面,子類只需要過載validate_logic函式,並在出現錯誤時為status,msg賦值即可。子類示例:
class
forgetpwdform
(agentform):
email = stringfield('email', validators=[
datarequired(message=u'請填寫者電子郵件'),
email(message=u'email格式不正確')
])def
validate_logic
(self):
user = user.query.filter_by(email=self.email.data, domain=self.domain).first()
ifnot user:
self.status = 1
self.msg = u'此賬號不存在'
return
false
return
true
設計模式筆記 Template模式
模板模式,邏輯很清晰,容易實現,用的也多!需求情景就是 對乙個業務邏輯 演算法實現,在不同物件中有不同的細節實現,但是邏輯的框架是相同的!就是說它們的操作步驟 介面是相同的,以繼承的方式實現!看下圖uml就明白了 到公司應聘,公司給每人發乙個簡歷表,讓大家填,而不是直接用每個人自己帶的簡歷!有幾點 ...
設計模式 模板模式(Template)
定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟 定義了乙個或多個抽象操作,以便讓子類實現,這些操作叫做基本操作 定義並實現了乙個模板方法,這個模板方法一般是乙個具體方法,它給出了乙個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽...
設計模式 Template 模板模式
是什麼 顧名思義,就是通過模板拓印的方式,定義模板採用抽象類來定義,公共的結構化邏輯需要在抽象類中完成,只將非公共的部分邏輯抽象成抽象方法,留待子類充實實現。abstractclass 實現乙個模板方法,定義了演算法的骨架,具體子類將重定義primitiveoperation以實現乙個演算法的步驟。...