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

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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值