python策略模式的应用_Head First 设计模式——策略模式(Strategy Pattern)——Python实现 | 学步园...
作者:liuyuan_jq
2011-06-13
策略模式定義
定義了
問題
J o e 上班的公司做了一套相當(dāng)成功的模擬鴨子游戲: SimUDuck。游戲中會(huì)出現(xiàn)各種鴨子,一邊游泳戲水,一邊呱
呱叫。此系統(tǒng)的內(nèi)部設(shè)計(jì)使用了標(biāo)準(zhǔn)的OO技術(shù),設(shè)計(jì)了一個(gè)鴨 子超類(Superclass),并讓各種鴨子繼承此超類。
設(shè)計(jì)原則
找出應(yīng)用中可能需要變化之處,把它 們獨(dú)立出來,不要和那些不需要變化 的代碼混在一起。
針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程
多用組合,少用繼承
設(shè)計(jì)鴨子的行為
我們知道Duck類內(nèi)的fly()和quack()會(huì)隨著鴨子的不同而改變。為了要把這兩個(gè)行為從Duck類中分開,我們將把它們從Duck類 中取出來,建立一組新類來代表每個(gè)行為。這樣,鴨子類就不再需要知道行為的實(shí)現(xiàn)細(xì)節(jié)。
class Duck(object):
"""
Duck接口類
"""
def __init__(self):
super(Duck, self).__init__()
def setFlyBehavior(self, flyBehavior):
self.flyBehavior = flyBehavior;
def setQuackBehavior(self, quackBehavior):
self.quackBehavior = quackBehavior
def display(self):
raise NotImplementedError("abstract duck")
def performFly(self):
self.flyBehavior.fly();
def performQuack(self):
self.quackBehavior.quack();
def swim(self):
print("All ducks float, even decoys!")
設(shè)計(jì)鴨子的飛行行為
class FlyBehavior(object):
"""
飛行行為接口類
"""
def fly(self):
raise NotImplementedError("abstract FlyBehavior")
設(shè)計(jì)鴨子的叫行為
class QuackBehavior(object):
def quack(self):
raise NotImplementedError("abstract QuackBehavior")
實(shí)現(xiàn)源碼
flyBehavior.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class FlyBehavior(object):
"""
飛行行為接口類
"""
def fly(self):
raise NotImplementedError("abstract FlyBehavior")
class FlyWithWings(FlyBehavior):
def fly(self):
print("I'm flying!!");
class FlyNoWay(FlyBehavior):
def fly(self):
print("I can't fly");
class FlyRocketPowered(FlyBehavior):
def fly(self):
print("I'm flying with a rocket");
quackBehavior.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class QuackBehavior(object):
def quack(self):
raise NotImplementedError("abstract QuackBehavior")
class Quack(QuackBehavior):
def quack(self):
print("Quack");
class FakeQuack(QuackBehavior):
def quack(self):
print("Qwak");
class MuteQuack(QuackBehavior):
def quack(self):
print("<< Silence >>")
class Squeak(QuackBehavior):
def quack(self):
print("Squeak");
duck.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flyBehavior import *
from quackBehavior import *
class Duck(object):
"""
Duck接口類
"""
def __init__(self):
super(Duck, self).__init__()
def setFlyBehavior(self, flyBehavior):
self.flyBehavior = flyBehavior;
def setQuackBehavior(self, quackBehavior):
self.quackBehavior = quackBehavior
def display(self):
raise NotImplementedError("abstract duck")
def performFly(self):
self.flyBehavior.fly();
def performQuack(self):
self.quackBehavior.quack();
def swim(self):
print("All ducks float, even decoys!")
class DecoyDuck(Duck):
"""
誘餌鴨
"""
def __init__(self):
super(DecoyDuck, self).__init__()
self.setFlyBehavior(FlyNoWay())
self.setQuackBehavior(MuteQuack())
def display(self):
print("I'm a duck Decoy")
class MallardDuck(Duck):
"""
綠頭鴨
"""
def __init__(self):
super(MallardDuck, self).__init__()
self.setFlyBehavior(FlyWithWings())
self.setQuackBehavior(Quack())
def display(self):
print("I'm a real Mallard duck")
class RedHeadDuck(Duck):
"""
紅頭鴨
"""
def __init__(self):
self.setFlyBehavior(FlyWithWings())
self.setQuackBehavior(Quack())
def display(self):
print("I'm a real Red Headed duck")
class ModelDuck(Duck):
"""
模型鴨
"""
def __init__(self):
self.setFlyBehavior(FlyNoWay())
self.setQuackBehavior(Quack())
def display(self):
print("I'm a model duck")
class RubberDuck(Duck):
"""
橡皮鴨
"""
def __init__(self):
self.setFlyBehavior(FlyNoWay())
self.setQuackBehavior(Squeak())
def display(self):
print("I'm a rubber duckie")
if __name__ == "__main__":
mallard = MallardDuck()
rubberDuckie = RubberDuck()
decoy = DecoyDuck()
model = ModelDuck()
# 鴨子quack
mallard.performQuack()
rubberDuckie.performQuack()
decoy.performQuack()
# 動(dòng)態(tài)改變鴨子的fly行為
model.performFly()
model.setFlyBehavior(FlyRocketPowered())
model.performFly()
# 綠頭鴨的 quack and fly
mallard = MallardDuck()
mallard.performQuack()
mallard.performFly()
執(zhí)行結(jié)果
Quack
Squeak
<< Silence >>
I can't fly
I'm flying with a rocket
Quack
I'm flying!!
總結(jié)
以上是生活随笔為你收集整理的python策略模式的应用_Head First 设计模式——策略模式(Strategy Pattern)——Python实现 | 学步园...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse python_【Pyth
- 下一篇: pythonif有多个条件怎么办_Pyt