热门问题
时间线
聊天
视角

狀態模式

一种设计模式:允许一个对象在内部状态改变时改变它的行为 来自维基百科,自由的百科全书

狀態模式
Remove ads

狀態模式(英語:state pattern),是一種行為類型軟件設計模式,它可以讓物件在其內部狀態有變化時,改變其行為。這種模式有點像有限狀態機的概念。狀態模式可以被當成成一種策略模式,它能夠通過在調用模式介面中所定義的方法來切換策略。

Thumb
UML 中的狀態模式[1]

狀態模式在計算機編程中的用途,是基於其內部狀態,將同一物件的各種有不同行為進行封裝。對於物件來說,這是可以在運行時更改其行為的一種更為簡潔方式,它無需訴諸條件語句而從而提高了可維護性。[1]

概述

狀態設計模式是《設計模式:可復用物件導向軟體的基礎》所收錄的二十三個模式之一,本書描述了如何解決常見的設計問題。此類問題涵蓋了靈活且可重用的面向對象軟件的設計,例如易於實現、更改、測試和重用的對象。[2]

狀態模式常用來解決兩個主要問題: [3]

  • 當對象的內部狀態改變時,它的行為也應該改變。
  • 應獨立定義特定於狀態的行為。也就是說,添加新狀態不應影響現有狀態的行為。

中為特定狀態直接實作行為是不夠彈性的,因為它將類與特定行為綁定,這將使得在獨立於這個類,不更改這個類的情況下,無法增加新的狀態或改變狀態的行為。因此,此模式描述了兩種解決方案:

  • 定義單獨的(狀態)物件,為每個狀態封裝特定於裝態的行為。亦即,定義一個介面(狀態)以用於執行特定於狀態的行為,並為每種狀態定義一個實現該接口的類。
  • 類將特定於狀態的行為委託給它的當前戕態物件,而不直接實現特定於狀態的行為。

這使得類與特定於狀態的行為如何實作獨立開來。新的狀態可以通過定義新的狀態類來實現。類可以在運行時,藉由改變當前狀態物件來改變其行為。

Remove ads

結構

Thumb
狀態設計模式的示例UML類圖和序列圖。[4]

在隨附的統一建模語言(UML)類圖中, Context 類不直接實現特定於狀態的行為。相反,Context通過State介面來執行特定於狀態的行為(state.handle() ),這使得Context獨立於特定於狀態行為的實現方式。ConcreteStateAConcreteStateB類實現State介面,即為每個狀態實現(封裝)特定於狀態的行為。UML序列圖說明了運行時互動:

Context對象將特定於狀態的行為委託給不同的State對象。首次時,Context調用handle(this)時,這基於了其當前(初始)狀態(ConcreteStateA),此時執行操作並調用 Context.setState(ConcreteStateB)來將當前狀態更改為ConcreteStateB 。下一次時,Context再次調用handle(this),這基於了其當前狀態對象(ConcreteStateB),此時執行操作並將當前狀態更改為ConcreteStateA

Remove ads

示例

Python

下面是Python的例子:

from abc import ABC, abstractmethod

class State(ABC):
    @abstractmethod
    def __call__(self): pass

class ConcreteStateA(State):
    def __call__(self): 
        print("Called ConcreteStateA handle method")

class ConcreteStateB(State):
    def __call__(self): 
        print("Called ConcreteStateB handle method")

class Context():
    def __init__(self, state):
        self.state = state
    def set_state(self, state):
        self.state = state
    def __call__(self):
        self.state()

其執行:

>>> state1 = ConcreteStateA()
>>> context = Context(state1)
>>> context()
Called ConcreteStateA handle method
>>> state2 = ConcreteStateB()
>>> context.set_state(state2)
>>> context()
Called ConcreteStateB handle method
Remove ads

參考

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads