Design Pattern_State(状态机模式)

参考jdon:http://www.jdon.com/designpatterns/designpattern_State.htm

我觉得state应该用的很多,许多动作都是依赖于状态的

说说我理解的几个要点:

1.state主要用在需要多个状态开关切换,且有多种切换方式

2.对象的操作决定于状态

3.将状态和状态相关(甚至是状态切换的操作)都放到state中

4.context负责操作调用state,但不负责管理,管理由state自己负责

我自己也写一个例子:

售票员买票,在空闲和忙碌这两种状态切换

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package state;

/**
 *
 * @author blacklaw
 */
public class DP_State {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Conductor conductor = new Conductor();
        conductor.setState(new Idle());
        conductor.sell();
        conductor.next();
        conductor.sell();
        conductor.next();
        conductor.sell();        
        
    }
    abstract class State{
        //下一步
        abstract public void next(Conductor c);
        //返回
        abstract public void back(Conductor c);
        abstract public void sell();
    }
    /**
     * 空闲状态
     */
    static class Idle extends State{

        @Override
        public void next(Conductor c) {
            c.state = new Busy();
        }

        @Override
        public void sell() {
            System.out.println("我来给你准备一张票");
        }

        @Override
        public void back(Conductor c) {
            c.state = new Busy();
        }
        
    }
    /**
     * 忙碌状态
     */
    static class Busy extends State{

        @Override
        public void next(Conductor c) {
            c.state = new Idle();
        }

        @Override
        public void sell() {
            System.out.println("等等,我很忙!");
        }

        @Override
        public void back(Conductor c) {
            c.state = new Idle();
        }

    }
    /**
     * 售票员
     */
    static class Conductor{
        State state;
        public void setState(State s){
            this.state = s;
        }
        public void next(){
            this.state.next(this);
        }
        public void back(){
            this.state.back(this);
        }
        public void sell(){
            this.state.sell();
        }
    }
    

}









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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值