您的位置:首页 > 编程语言 > Java开发

JAVA设计模式(二十一)——状态模式

2015-03-19 22:16 232 查看

1、状态模式

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

2、应用场景

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

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

3、结构图示



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、模式总结

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

        状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java设计模式