设计模式-行为型之状态模式

模式动机

   很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性我们称之为状态。当这样的对象与外部事件产生交互时,其内部状态会随之改变,从而使其行为也发生对应的改变。比如人作为一个对象(Person),假设有一个属性叫做饥饿程度(hungerLevel),有一种行为叫吃饭(eat),当饥饿程度为“非常饿”时,我们吃饭时会“大吃一顿”,当饥饿程度为“很饱”时,我们吃饭时会“只吃一点点”,也就是说,我们吃饭的这个行为会因我们的饥饿程度的不同而不同。同时我们的饥饿程度还会随时发生转换。此时,我们便可以使用状态模式。

模式定义

  允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式描述了对象状态的变化以及对象如何在每一种状态下表现出不同的行为

模式结构

模式结构
  环境类:Context,定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态
  抽象状态类:State,定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
  具体状态类:ConcreteState,每一个具体状态类都实现了环境(Context)的一个状态所对应的行为

代码示例

  我们知道HTTP有一个状态码,用来表示服务器的响应状态,不同的状态码对应了不同的响应。下面我们以此为例来演示状态模式如何工作。

//抽象状态类
public abstract class AbstractState {
    public abstract void response();
}
//具体状态类
public class State_200 extends AbstractState{
    @Override
    public void response() {
        System.out.println("200,请求成功");
    }
}
public class State_404 extends AbstractState{
    @Override
    public void response() {
        System.out.println("404,您请求的资源不存在");
    }
}
public class State_502 extends AbstractState{
    @Override
    public void response() {
        System.out.println("502,Bad Gateway");
    }
}
//环境类
public class Server {
    private int status = 200;//默认是200状态
    private AbstractState state;
    private State_200 state_200 = new State_200();
    private State_404 state_404 = new State_404();
    private State_502 state_502 = new State_502();
    public void handle(){
        checkState();
        state.response();
    }
    //检查状态,负责状态转换,某些场景下我们需要把状态转换工作放到具体状态类中实现
    private void checkState(){
        if(status==200){
            this.setState(state_200);
        }else if(status==404){
            this.setState(state_404);
        }else if(status==502){
            this.setState(state_502);
        }
    }
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    public AbstractState getState() {
        return state;
    }
    public void setState(AbstractState state) {
        this.state = state;
    }
}
//客户端测试类
public class Client {
    public static void main(String[] args) {
        Server server = new Server();
        server.handle();//200,请求成功

        server.setStatus(404);
        server.handle();//404,您请求的资源不存在

        server.setStatus(502);
        server.handle();//502,Bad Gateway
    }
}

  从上面的例子可以看出,当环境类Server的状态status发生变化时,对应的handle()会有不同的行为。

总结

  状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值