设计模式九————状态模式

状态模式定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式初步理解:状态模式内部含有和一个状态对象的引用,当状态不一样时,这个引用所指向的对象也不一样。调用的方法自然也就不一样。和策略模式有些类似。
code…


状态的抽象接口:

public interface State {
    public void work(Context context);
}

具体的三个状态:

public class ExciteState implements State {
    @Override public void work(Context context) {
        System.out.println("在兴奋状态中干活");
        context.setState(new ExhaustState());
    }
    @Override public String toString() {
        return "兴奋状态";
    }
}
public class ExhaustState implements State {
    @Override public void work(Context context) {
        System.out.println("在疲劳状态中干活");
        context.setState(new SleepyState());
    }
    @Override public String toString() {
        return "疲劳状态";
    }
}
public class SleepyState implements State {
    @Override public void work(Context context) {
        System.out.println("正在睡梦中干活");
        context.setState(new ExciteState());//设置下一状态
    }
    @Override public String toString() {
        return "睡眠状态";
    }
}

context上下文类:

public class Context {
    private State state;

    public Context(State state) {
        this.state = state;
    }
    public State getState() {
        return state;
    }
    public void setState(State state) {
        this.state = state;
    }
    public void request()
    {
        state.work(this);
    }
}

内部的引用State所指向的对象不同时,调用的work方法不同。再执行完当前状态要执行的事务后,设置下一状态。
mian方法:

public class Main {
    public static void main(String[] args) {
        int i=100;
        Context context=new Context(new ExciteState());
        while(--i!=0) {
            System.out.println(context.getState());
            context.request();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果是在三种状态中循环切换。

兴奋状态
在兴奋状态中干活
疲劳状态
在疲劳状态中干活
睡眠状态
正在睡梦中干活
......

总结:状态模式是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放入一个对象中,可以通过定义新的子类来增加新的状态。


上一篇
---The End---
下一篇
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值