行为型模式
- 模板方法模式(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
` 实例,并演示了状态从开到关的转变。
这就是状态模式的基本结构和一个简单示例。状态模式有助于在对象的状态变化时封装对象的行为,并使得状态转换更加清晰和易于维护。
状态模式和策略模式在某种程度上有一些相似之处,因为它们都涉及到在运行时改变对象的行为。
相似之处
- 封装算法/行为:两者都涉及将算法或行为封装到独立的类中,以便在运行时进行切换。
- 解耦:状态模式和策略模式都有助于将特定的行为与上下文对象解耦,使得它们可以独立地变化和复用。
不同之处
- 关注点:状态模式关注对象在不同状态下的行为变化,而策略模式关注在不同策略(算法)下的行为变化。
- 触发方式:状态模式的行为转换通常是由对象内部的状态改变触发的,而策略模式的行为转换通常是由客户端显式调用触发的。
总结
虽然这两种模式有相似之处,但它们的关注点和使用场景不同。状态模式适用于对象状态改变时的行为变化,而策略模式适用于根据不同的需求选择不同的算法或策略。理解它们之间的区别有助于选择适当的模式来解决特定的设计问题。