在Java中應用State設計模式

來源:互聯網
上載者:User

對象的狀態由各個屬性的當前值構成。當我們調用某個對象的setXXX()方法時,通常表示修改它的XXX屬性。另外,對象在執行方法時,也可能修改自己的狀態。在某些情形下,例如建立事務或機器模型時,對象的狀態可能是決定其行為的關鍵因素,依賴於狀態的代碼邏輯可能遍佈於類的大量方法。State模式的目標就是簡化這類代碼,把依賴於狀態的邏輯集中到一組類,每一個類代表一種不同的狀態,避免if語句嵌套過深或過於複雜,轉而依賴於多態性來調用不同的方法。

狀態模型

如果對象的狀態資訊很關鍵,對象會擁有一些變數來指示如何根據狀態做出相應的動作。這些變數大量地散佈於複雜的多層嵌套if語句中,來描述對象如何響應可能出現的事件。用這種方式建立物件模型的最大缺點在於if語句可能變得相當複雜一旦要修改對象的狀態模型,往往有多個方法的許多if語句需要調整。

以傳送帶的門為例,考慮其狀態變化過程為:傳送帶的門由單個按鈕控制,並且假設初始時處於關閉狀態。按一下按鈕門開始開啟,如果在門完全開啟之前再次按下按鈕,門開始關閉。一旦門完全開啟,它將在2秒延時之後自動開始關閉過程。要禁止門自動關閉,可以在門開啟之後按一下按鈕。圖1描述了傳送門的狀態變化情況。它是一個UML狀態機器(State Machine),其中click表示按下按鈕的動作。顯然,與純文字描述相比UML狀態機器圖示更加直觀易懂。

按照常規的設計思路(不使用State設計模式),在類比傳送帶工作過程的軟體中,可以使用一個Door1對象代表傳送門(如圖2所示),狀態改變事件由傳送帶軟體發送給Door1對象。

圖1 UML狀態機器

圖2 狀態改變事件發送給Door1對象

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.