Java设计模式_(行为型)_状态模式
引用百科
(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式的示意性类图如下所示:
相关角色
状态模式所涉及到的角色有:
●环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
●抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
●具体状态(RealState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
具体实现
具体代码
1、状态接口
//状态类接口
public interface State {
// 行为操作
public void handle();
}
2、状态类具体行为实现
//具体状态类实现A
public class RealStateA implements State {
// 具体行为实现
@Override
public void handle() {
System.out.println("状态A...");
System.out.println("执行A操作...");
}
}
//具体状态类实现B
public class RealStateB implements State {
// 具体行为实现
@Override
public void handle() {
System.out.println("状态B...");
System.out.println("执行B操作...");
}
}
3、环境角色类
//环境角色类
public class Context {
// 内部状态
private State status;
public void setStatus(State status) {
this.status = status;
}
// 行为
public void request() {
status.handle();
}
}
4、客户端Client测试
public class Client {
public static void main(String[] args) {
// 创建环境
Context context = new Context();
// 设置环境状态
context.setStatus(new RealStateA());
// 状态改变时行为也自动改变
context.request();
// 状态改变时行为也自动改变
context.setStatus(new RealStateB());
context.request();
}
}
以上代码简单实现了状态模式,运行输出:
状态A...
执行A操作...
状态B...
执行B操作...
以上代码状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
适用性
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态,这个状态通常用一个或多个枚举常量表示,通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。