状态模式(State Pattern)
状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
概念
- Context(上下文):维护一个指向当前状态的引用,并允许客户端进行操作,其行为随着其状态对象的改变而改变。
- State(状态):定义一个接口,封装与上下文的一个特定状态相关的行为。
- Concrete States(具体状态):实现状态接口的类,每一个类代表了上下文的一种状态。
优点
- 封装了转换规则:状态模式将所有与特定状态相关的行为放到一个对象中。
- 通过将所有状态相关的代码放在一个位置,简化了上下文:上下文变得非常简单,只需要维护一个当前状态的引用,并将所有状态的工作委托给状态对象。
- 允许新增状态类来改变行为:通过创建新的具体状态类,可以很容易地添加新的状态和转换。
缺点
- 可能会导致类的数目增加:每增加一个状态,就需要增加一个具体状态类,这可能会导致系统中类的数量剧增。
- 可能会导致某些状态和转换的逻辑复杂化:如果状态数目过多或转换逻辑过于复杂,会使得系统难以理解和维护。
Java代码示例
考虑一个简单的文本编辑器,具有两种状态:正常状态和删除状态,可以在这两种状态之间切换,并根据当前状态执行不同操作。
java复制代码
// 状态接口
interface State {
void writeName(StateContext context, String name);
}
// 具体状态1:正常状态
class NormalState implements State {
public void writeName(StateContext context, String name){
System.out.println(name);
}
}
// 具体状态2:删除状态
class DeleteState implements State {
public void writeName(StateContext context, String name){
System.out.println(name.toUpperCase().replace("A", ""));
}
}
// 上下文
class StateContext {
private State currentState;
public StateContext(){
currentState = new NormalState();
}
public void setState(State state) {
currentState = state;
}
public void writeName(String name){
currentState.writeName(this, name);
}
}
// 客户端代码
public class StatePatternDemo {
public static void main(String[] args) {
StateContext context = new StateContext();
context.writeName("Saturday");
context.setState(new DeleteState());
context.writeName("Saturday");
}
}
在这个例子中,StateContext
类维护了一个当前状态的引用,并允许客户端根据当前状态执行操作。NormalState
和 DeleteState
是具体状态,分别实现了 State
接口。客户端通过改变上下文的状态,可以改变上下文行为,从而实现在不同状态下执行不同操作的功能。