類圖比較通俗易懂,那麼先來實現一下,看看有什麼問題
看到這個程式,是不是有點太簡單~~非也非也,繼續往下,這個程式有什麼問題?
電梯門可以開啟,但是不能隨便開啟吧!
電梯執行這四個動作應該都有前提條件,在特定的條件下才能做特定的動作
為了解決這些暫時能想到的問題,先來分析電梯有哪些特定的狀態
電梯的狀態和動作之間的關係下圖來演示:
有了這個前提,那我們的**中的方法執行前就得有前置條件的判斷了,只有滿足相應條件才能進行相應的動作
**改動
程式有了,咱們再來挑挑骨頭吧!
電梯的實現類【lift】有點長
擴充套件性非常差--比如再加幾個狀態或者方法,變動很大。。。
非常規狀態無法實現:電梯故障
這些問題是實實在在存在的,現在我們換個角度看問題--這個狀態是由什麼動作產生的,以及這個狀態下可以執行哪些動作【可以新增狀態介面】
解釋: liftstate:在這之中,宣告了乙個受保護的型別context變數,這個是串聯各個狀態的封裝類,封裝的目的很明顯,就是電梯物件內部狀態的變化不被呼叫類知曉,也就是迪公尺特法則,並且還定義了四個具體的實現類,承擔的是狀態產生以及狀態間的轉換過渡。
**看看我們這段**解決了哪些問題
**太長--通過子類解決,子類的**都比較短,也取消了switch-case的結構
不符合開閉原則--增加狀態,現在只需在原有的類上增加即可,不用去修改
不符合迪公尺特法則--現在是各個狀態的單獨類,只有與這個狀態相關的因素改了,這個類才做相應的修改
狀態模式的核心是封裝,狀態的變更引起了行為的變更,從外部看起來就像這個物件對應的類發生了改變一樣
使用場景
行為隨著改變狀態而改變的場景【許可權設計】
條件、分支判斷語句的替代者【switch-case、if-else if】
注意事項
複雜狀態切換示意圖牌【收費**:普通使用者、普通會員、vip會員、白金使用者】
當電梯碰上維修
狀態機管理【state machine】
初始化狀態
掛起狀態
完成狀態
設計之禪 狀態模式
之前我寫過一篇策略模式的文章,講的是如何靈活地改變物件的行為,今天要講的模式和策略模式非常像,它也是讓你設計出如何靈活改變物件行為的乙個模式,與策略模式不同的是它是根據自身狀態而自行地改變行為,它就是狀態模式。首先我們來分析乙個例項 現在的遊戲基本都有自動打怪做任務的功能,如果讓你實現這個功能你會怎...
設計模式之禪
設計模式之禪 大話面向初學者 禪面向有了一定基礎後提公升能力的讀者 看大話,只是看故事,只是感性認識,對於很多初學者而又沒專案經驗 或 閱讀 編寫量 的人來說,比較適合用於入門 看禪 主要是有一定的專案經驗 或 閱讀 編寫量 基礎上,而又大致閱讀過23種設計模式中的20種以上基本概念後,再深化提公升...
設計模式之禪之設計模式 門面模式
1 package com.yeepay.sxf.template18 2 3 寫信的業務類 4 隱藏在門面角色裡邊,不需要暴露太多5 author sxf6 7 8public inte ce iletterprocess view code 寫信的業務類的實現 1 package com.yee...