[python|高級篇|筆記|設(shè)計模式|策略模式]
引子
接著開始吧,還是讀了HF之后的學(xué)習(xí)記錄。
繼承并不是適當(dāng)?shù)慕鉀Q方式,因為對象的行為在子類里面不斷變化隙疚,并且讓所有子類都有這些行為是不恰當(dāng)?shù)摹?br>
設(shè)計原則
找出可能需要變化的部分,把他們獨立出來磕道,不要和那些不需要變化的代碼混在一起
正文
如果每次新的需求一來甚淡,都會使某方面的代碼變化,那么就可以確定捅厂,這部分的代碼需要抽離出來,和其他穩(wěn)定的代碼有所區(qū)分资柔,把會變化的部分取出來并封裝起來焙贷,以便以后可以輕易地改動或擴充此部分,而不影響不需要變化的其他部分贿堰。
找個例子來說明這個事辙芍,設(shè)計一個游戲,游戲里面有各種各樣的武器羹与,各種各樣的職業(yè)故硅,各種各樣的技能,這里需要創(chuàng)建一個拿著劍具有玉女心經(jīng)劍法技能的國王職業(yè)的人物纵搁,該怎么去實現(xiàn)呢吃衅?
先取出要變化的部分,武器腾誉,技能徘层,人物可能都會發(fā)生變化,我可能增加一個武器利职,修煉一項新的技能趣效,創(chuàng)建一個新的職業(yè),這些變化的部分取出來猪贪,單獨實現(xiàn)跷敬。
接著創(chuàng)建一個客戶類,由用戶自行制定需要創(chuàng)建出什么樣的人物
代碼
分別定義武器热押,職業(yè)西傀,技能的實現(xiàn)
武器
class SwordBehavior(object):
def __init__(self):
self.behaviorCode = "SWORD"
def __call__(self):
return "use the sword"
class KnifeBehavior(object):
def __init__(self):
self.behaviorCode = "KNIFE"
def __call__(self):
return "use the knife"
class BowAndArrowBehavior(object):
def __init__(self):
self.behaviorCode = "BOWANDARROW"
def __call__(self):
return "use the bow and arrow"
class AxeBehavior(object):
def __init__(self):
self.behaviorCode = "AXE"
def __call__(self):
return "use the axe"
職業(yè)
class KingFigure(object):
def __init__(self):
self.figureCode = "KING"
def __call__(self):
return "I am a king"
class QueenFigure(object):
def __init__(self):
self.figureCode = "QUEEN"
def __call__(self):
return "I am a queen"
class TrollFigure(object):
def __init__(self):
self.figureCode = "TROLL"
def __call__(self):
return "I am a troll"
class KnightFigure(object):
def __init__(self):
self.figureCode = "KNIGHT"
def __call__(self):
return "I am a knight"
技能
class attack1Method(object):
def __init__(self):
self.attackCode = "ATTACK1"
def __call__(self):
return "with attack1"
class attack2Method(object):
def __init__(self):
self.attackCode = "ATTACK2"
def __call__(self):
return "with attack2"
class attack3Method(object):
def __init__(self):
self.attackCode = "ATTACK3"
def __call__(self):
return "with attack3"
創(chuàng)建一個類來設(shè)定每個人物
class CharacterCreator(object):
def __init__(self):
self.__weaponImpls = [SwordBehavior(),
KnifeBehavior(),
BowAndArrowBehavior(),
AxeBehavior()]
self.__figureImpls = [KingFigure(),
QueenFigure(),
TrollFigure(),
KnightFigure()]
self.__attackImpls = [attack1Method(),
attack2Method(),
attack3Method]
def __call__(self, weapon, character, attack):
for wimpl in self.__weaponImpls:
if wimpl.behaviorCode == weapon:
for fimpl in self.__figureImpls:
if fimpl.figureCode == character:
for aimpl in self.__attackImpls:
if aimpl.attackCode == attack:
return fimpl() + " " +wimpl() + " " + aimpl()
之后,搞點數(shù)據(jù)測試一下
def main():
chracterCreator = CharacterCreator()
king = chracterCreator("SWORD", "KING", "ATTACK1")
queen = chracterCreator("KNIFE", "QUEEN", "ATTACK2")
print(king)
print(queen)
if __name__ == '__main__':
main()
輸出的結(jié)果
I am a king use the sword with attack1
I am a queen use the knife with attack2
尾聲
這就是策略模式楞黄,也不知道對不對池凄。