时间:2025-02-26 23:39
人气:
作者:admin
状态模式允许对象在其内部状态改变时改变其行为,使其看上去就像改变了自身所属的类一样。
状态模式是为了把一大串if...else...的逻辑给分拆到不同的状态类中,使得将来增加状态比较容易。
状态模式的关键设计思想在于状态切换。简单的状态转换可以直接由调用方指定,复杂的状态转换可以在内部根据条件触发完成。
状态模式建议为对象的所有可能状态新建一个类,然后将所有状态的对应行为抽取到这些类中。
当对象的行为依赖于其状态,并且状态之间的转换复杂时;当代码中存在大量的条件语句,并且这些条件语句依赖于对象的状态时,我们都可以使用状态模式。
状态模式通常有以下组成部分:
我们实现一个简单的状态模式。
1、抽象状态类
// 抽象状态类
public interface State {
void handle(Context context);
}
2、具体状态类
// 具体状态类A
public class ConcreteStateA implements State {
@Override
public void handle(Context context) {
System.out.println("Handling request in State A.");
context.setState(new ConcreteStateB());
}
}
// 具体状态类B
public class ConcreteStateB implements State {
@Override
public void handle(Context context) {
System.out.println("Handling request in State B.");
context.setState(new ConcreteStateA());
}
}
3、环境类
// 环境类
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle(this);
}
}
4、客户端
// 客户端代码
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context(new ConcreteStateA());
context.request(); // 输出: Handling request in State A.
context.request(); // 输出: Handling request in State B.
}
}
状态模式的优缺点。
优点:
缺点:
状态模式通过将状态和行为封装在独立的类中,使得对象的行为随着状态的变化而变化,增强了系统的灵活性和可维护性。
状态模式跟策略模式很相似,但有一个关键性的不同点——在状态模式中,特定状态是知道其他所有状态的存在的,且能触发从一个状态到另一个状态的转换;而策略则几乎是完全不知道其他策略的存在的。
他人犯错,常有己过。-- 烟沙九洲