Python與設(shè)計(jì)模式之狀態(tài)模式

一盗棵、電梯控制器

電梯在我們周邊隨處可見壮韭,電梯的控制邏輯中心是由電梯控制器實(shí)現(xiàn)的。電梯的控制邏輯纹因,即使簡單點(diǎn)設(shè)計(jì)喷屋,把狀態(tài)分成開門狀態(tài),停止?fàn)顟B(tài)和運(yùn)行狀態(tài)瞭恰,操作分成開門屯曹、關(guān)門、運(yùn)行、停止恶耽,那流程也是很復(fù)雜的密任。首先,開門狀態(tài)不能開門偷俭、運(yùn)行浪讳、停止;停止?fàn)顟B(tài)不能關(guān)門涌萤,停止淹遵;運(yùn)行狀態(tài)不能開門、關(guān)門负溪、運(yùn)行透揣。要用一個(gè)一個(gè)if…else…實(shí)現(xiàn),首先代碼混亂笙以,不易維護(hù)淌实;二是不易擴(kuò)展。至于各種設(shè)計(jì)原則什么的……
那該如何實(shí)現(xiàn)猖腕?在上邊的邏輯中拆祈,每個(gè)操作僅僅是一個(gè)操作,狀態(tài)切換與操作是分離的倘感,這也造成后來操作和狀態(tài)“相互配合”的“手忙腳亂”放坏。如果把狀態(tài)抽象成一個(gè)類,每個(gè)狀態(tài)為一個(gè)子類老玛,每個(gè)狀態(tài)實(shí)現(xiàn)什么操作淤年,不實(shí)現(xiàn)什么操作,僅僅在這個(gè)類中具體實(shí)現(xiàn)就可以了蜡豹。
下面我們實(shí)現(xiàn)這個(gè)邏輯麸粮。
先實(shí)現(xiàn)抽象的狀態(tài)類:

class LiftState:
    def open(self):
        pass
    def close(self):
        pass
    def run(self):
        pass
    def stop(self):
        pass

而后實(shí)現(xiàn)各個(gè)具體的狀態(tài)類:

class OpenState(LiftState):
    def open(self):
        print "OPEN:The door is opened..."
        return self
    def close(self):
        print "OPEN:The door start to close..."
        print "OPEN:The door is closed"
        return StopState()
    def run(self):
        print "OPEN:Run Forbidden."
        return self
    def stop(self):
        print "OPEN:Stop Forbidden."
        return self
class RunState(LiftState):
    def open(self):
        print "RUN:Open Forbidden."
        return self
    def close(self):
        print "RUN:Close Forbidden."
        return self
    def run(self):
        print "RUN:The lift is running..."
        return self
    def stop(self):
        print "RUN:The lift start to stop..."
        print "RUN:The lift stopped..."
        return StopState()
class StopState(LiftState):
    def open(self):
        print "STOP:The door is opening..."
        print "STOP:The door is opened..."
        return OpenState()
    def close(self):
        print "STOP:Close Forbidden"
        return self
    def run(self):
        print "STOP:The lift start to run..."
        return RunState()
    def stop(self):
        print "STOP:The lift is stopped."
        return self

為在業(yè)務(wù)中調(diào)度狀態(tài)轉(zhuǎn)移,還需要將上下文進(jìn)行記錄镜廉,需要一個(gè)上下文的類弄诲。

class Context:
    lift_state=""
    def getState(self):
        return self.lift_state
    def setState(self,lift_state):
        self.lift_state=lift_state
    def open(self):
        self.setState(self.lift_state.open())
    def close(self):
        self.setState(self.lift_state.close())
    def run(self):
        self.setState(self.lift_state.run())
    def stop(self):
        self.setState(self.lift_state.stop())

這樣,在進(jìn)行電梯的調(diào)度時(shí)娇唯,只需要調(diào)度Context就可以了齐遵。業(yè)務(wù)邏輯中如下所示:

if __name__=="__main__":
    ctx = Context()
    ctx.setState(StopState())
    ctx.open()
    ctx.run()
    ctx.close()
    ctx.run()
    ctx.stop()

打印如下:

STOP:The door is opening...
STOP:The door is opened...
OPEN:Run Forbidden.
OPEN:The door start to close...
OPEN:The dorr is closed
STOP:The lift start to run...
RUN:The lift start to stop...
RUN:The lift stopped...

由邏輯中可知,電梯先在STOP狀態(tài)塔插,然后開門梗摇,開門時(shí)運(yùn)行Run,被禁止想许,然后伶授,關(guān)門断序、運(yùn)行、停止糜烹。

二逢倍、狀態(tài)模式

狀態(tài)模式的定義如下:當(dāng)一個(gè)對象內(nèi)在狀態(tài)改變時(shí)允許其改變行為,這個(gè)對象看起來像改變了其類景图。

狀態(tài)模式

三较雕、狀態(tài)模式的優(yōu)點(diǎn)和應(yīng)用場景

優(yōu)點(diǎn):

1、狀態(tài)模式的優(yōu)點(diǎn)是結(jié)構(gòu)清晰挚币,相比于if…else…簡約了不少亮蒋;
2、封裝性好妆毕,外部調(diào)用不必知道內(nèi)部實(shí)現(xiàn)細(xì)節(jié)慎玖。

應(yīng)用場景:

1、行為狀態(tài)改變的場景笛粘。這點(diǎn)在各種控制器中非常常見趁怔,同時(shí),邏輯結(jié)構(gòu)為狀態(tài)轉(zhuǎn)移圖的場景中都非常適用薪前。

四润努、狀態(tài)模式的缺點(diǎn)

1、在狀態(tài)比較多時(shí)示括,子類也會(huì)非常多铺浇,不便于管理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垛膝,一起剝皮案震驚了整個(gè)濱河市鳍侣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吼拥,老刑警劉巖倚聚,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凿可,居然都是意外死亡惑折,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門矿酵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唬复,“玉大人矗积,你說我怎么就攤上這事全肮。” “怎么了棘捣?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵辜腺,是天一觀的道長。 經(jīng)常有香客問我,道長评疗,這世上最難降的妖魔是什么测砂? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮百匆,結(jié)果婚禮上砌些,老公的妹妹穿的比我還像新娘。我一直安慰自己加匈,他們只是感情好存璃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雕拼,像睡著了一般纵东。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啥寇,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天偎球,我揣著相機(jī)與錄音,去河邊找鬼辑甜。 笑死衰絮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磷醋。 我是一名探鬼主播岂傲,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼子檀!你這毒婦竟也來了镊掖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褂痰,失蹤者是張志新(化名)和其女友劉穎亩进,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缩歪,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡归薛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匪蝙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片主籍。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逛球,靈堂內(nèi)的尸體忽然破棺而出千元,到底是詐尸還是另有隱情,我是刑警寧澤颤绕,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布幸海,位于F島的核電站祟身,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏物独。R本人自食惡果不足惜袜硫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挡篓。 院中可真熱鬧婉陷,春花似錦、人聲如沸官研。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阀参。三九已至肝集,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛛壳,已是汗流浹背杏瞻。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衙荐,地道東北人捞挥。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像忧吟,于是被迫代替她去往敵國和親砌函。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 9,000評論 0 13
  • 先提一下昨天的思路: 電梯包含了四種狀態(tài):關(guān)門溜族,開門讹俊,運(yùn)動(dòng),停止 狀態(tài)之間會(huì)進(jìn)行轉(zhuǎn)換:關(guān)門(默認(rèn))->開門->關(guān)門...
    qufl閱讀 7,814評論 0 51
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,105評論 1 32
  • 都說孩子的世界是五彩斑斕的,那么寡壮,兒童空間的色彩就是五顏六色嗎贩疙? 色彩作為兒童空間的組成部分,我們首先應(yīng)該關(guān)注的是...
    尼莫蘇荷拉閱讀 956評論 0 1
  • 鐵板燒的食用方式與牛排不同况既,西方人認(rèn)為鐵板燒(鐵板燒き这溅,teppan-yaki)是日本人的東西,而日本人則將它視為...
    嗶嗶啵啵ooo閱讀 3,031評論 1 9