1、状态模式

        状态模式在英文中被称为State模式,是行为设计模式的一种。State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。


2、应用场景

        状态模式有一定的使用场景,比如:当控制一个对象状态转换的条件表达式过于复杂的时候,可以考虑把状态的判断逻辑转译到表现不同状态的一系列类当中。这样一来,就可以把复杂的判断逻辑简化。

        常见的场景如我们在网上购物,一般会有下订单,买家支付,商家接单,商家发货,货物签收等等一系列不同的状态,这样每个状态的逻辑可以封装一下。比如我们人来说,每天早中晚肯定是不同的状态,早上吃早餐,中午吃午餐,晚上吃晚餐,半夜吃宵夜等等,都算是一个人的不容状态。


3、结构图示

Java根据状态切换方法 java状态模式应用场景_java设计模式


4、角色职责

由上面的结构图示来看,我们的状态模式,主要有以下的几种角色:

Context角色:用户对象拥有一个State类型的成员,以标识对象的当前状态; 

State角色:该角色一般是一个接口或者抽象类,用来封装与Context的特定状态相关的行为; 

ConcreteState角色:接口实现类或子类实现了一个与Context某个状态相关的行为。


6、源码示例

先看看一个State的抽象类吧,如下:

/**
 * 抽象类,持有Person类的引用
 * @author ljtyzhr
 *
 */
public abstract class State {  
  
    public abstract void doSomething(Person person);  
}



再来看看一个实际的实现类,我们规定在时间为7的时候,是早餐时间,如下:


public class MState extends State {  
  
    @Override  
    public void doSomething(Person person) {  
        if(person.getHour() == 7)  
            System.out.println("hello,我在吃早餐哦");  
        else {  
            person.setState(new LState());  
            person.doSomething();  
        }  
    }  
}

剩下的几个午餐和晚餐,以及未定义的工作时间类,这里就不再详细描述,只给出最后的未定义的时间类,如下:

public class NoState extends State {  
  
    @Override  
    public void doSomething(Person person) {  
        System.out.println(person.getHour() + "未定义");  
    }  
  
}




7、测试分析

这里我们的Context类,就是我们的测试类,如下:

public class MainClass {  
  
    public static void main(String[] args) {  
        Person person = new Person();  
          
        person.setHour(7);  
        person.doSomething();  
          
        person.setHour(12);  
        person.doSomething();  
          
        person.setHour(18);  
        person.doSomething();  
          
        person.setHour(20);  
        person.doSomething();   
    }  
}

结果如下:

hello,我在吃早餐哦
我在吃午饭呢。。。。。。
晚餐时间咯-----
对不起,20,未定义



8、模式总结

        状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。

        状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。