行為型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 觀察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 備忘錄模式(Memento Pattern)
- 解釋器模式(Interpreter Pattern)
- 狀態模式(State Pattern)
- 策略模式(Strategy Pattern)
- 職責鏈模式(Chain of Responsibility Pattern)
- 訪問者模式(Visitor Pattern)
當涉及狀態模式時,它主要用于在對象的狀態改變時改變其行為。狀態模式允許對象在內部狀態改變時改變它的行為,看起來好像是改變了它的類。
以下是狀態模式的基本結構和示例:
結構
- Context(上下文):定義客戶感興趣的接口,維護一個當前狀態,并將與狀態相關的操作委托給當前狀態對象。
- State(狀態):定義一個接口以封裝與Context的一個特定狀態相關的行為。
- ConcreteState(具體狀態):每一個具體狀態類實現了與Context的一個狀態相關的行為。
示例
讓我們以一個簡單的燈光控制器為例來說明狀態模式。
// State 接口
interface State { void doAction(Context context);
} // ConcreteState 實現
class OnState implements State { public void doAction(Context context) { System.out.println("Light is turned on"); context.setState(this); }
} class OffState implements State { public void doAction(Context context) { System.out.println("Light is turned off"); context.setState(this); }
} // Context 類
class Context { private State state; public Context() { state = null; } public void setState(State state) { this.state = state; } public State getState() { return state; }
} // 使用示例
public class StatePatternExample { public static void main(String[] args) { Context context = new Context(); State onState = new OnState(); onState.doAction(context); State offState = new OffState(); offState.doAction(context); }
}
在這個示例中,`Context
`?表示燈光控制器,`State
`?是一個接口,定義了狀態改變時的行為。`OnState
`?和?`OffState
`?分別表示開和關的狀態,它們實現了?`State
`?接口來定義狀態改變時的行為。在?`StatePatternExample
`?中,我們創建了一個?`Context
`?實例,并演示了狀態從開到關的轉變。
這就是狀態模式的基本結構和一個簡單示例。狀態模式有助于在對象的狀態變化時封裝對象的行為,并使得狀態轉換更加清晰和易于維護。
狀態模式和策略模式在某種程度上有一些相似之處,因為它們都涉及到在運行時改變對象的行為。
相似之處
- 封裝算法/行為:兩者都涉及將算法或行為封裝到獨立的類中,以便在運行時進行切換。
- 解耦:狀態模式和策略模式都有助于將特定的行為與上下文對象解耦,使得它們可以獨立地變化和復用。
不同之處
- 關注點:狀態模式關注對象在不同狀態下的行為變化,而策略模式關注在不同策略(算法)下的行為變化。
- 觸發方式:狀態模式的行為轉換通常是由對象內部的狀態改變觸發的,而策略模式的行為轉換通常是由客戶端顯式調用觸發的。
總結
雖然這兩種模式有相似之處,但它們的關注點和使用場景不同。狀態模式適用于對象狀態改變時的行為變化,而策略模式適用于根據不同的需求選擇不同的算法或策略。理解它們之間的區別有助于選擇適當的模式來解決特定的設計問題。