美文网首页大数据程序员IT面试
设计模式笔记(16)--状态模式

设计模式笔记(16)--状态模式

作者: 球球球球笨 | 来源:发表于2018-06-06 10:49 被阅读4次

    状态模式

    GOF对于状态模式的定义是:“当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。”

    状态模式的好处就是将与特定状态相关的行为进行局部化,并且将不同状态的行为进行分割。也就是将特定的与该状态相关的行为都放进一个对象之中,由于所有与状态有关的代码都存在于某个具体的状态类中,所以通过定义新的具体状态类就可以很容易地添加新的状态和转换。

    下面以列车的状态为例,上代码

    package State;
    
    public class Train {
        private State currentState;
        public Train()
        {
            currentState = new StartState();
        }
        private int speed;
        private boolean giveWay = false;
        public void setState(State state)
        {
            currentState = state;
        }
        public int getSpeed() {
            return speed;
        }
        public void setSpeed(int speed) {
            this.speed = speed;
        }
        public boolean isGiveWay() {
            return giveWay;
        }
        public void setGiveWay(boolean giveWay) {
            this.giveWay = giveWay;
        }
        public void Run()
        {
            currentState.Run(this);
        }
    }
    
    package State;
    
    public abstract class State  {
        public abstract void Run(Train train);
    }
    
    package State;
    
    public class StartState extends State{
    
        @Override
        public void Run(Train train) {
            // TODO Auto-generated method stub
            if(train.getSpeed() == 0)
            {
                System.out.println("当前时速为:" + train.getSpeed()
                + "列车开始启动");
            }
            else
            {
                train.setState(new FastState());
                train.Run();
            }
        }
    }
    
    package State;
    
    public class FastState extends State{
    
        @Override
        public void Run(Train train) {
            // TODO Auto-generated method stub
            if(train.getSpeed() < 200)
            {
                System.out.println("当前时速为:" + train.getSpeed()
                + "列车正在加速");
            }
            else
            {
                train.setState(new SlowState());
                train.Run();
            }
        }
    }
    
    package State;
    
    public class SlowState extends State{
        @Override
        public void Run(Train train) {
            // TODO Auto-generated method stub
            if(train.getSpeed() > 200)
            {
                System.out.println("当前时速为:" + train.getSpeed()
                + "列车正在减速");
            }
            else
            {
                train.setState(new RunState());
                train.Run();
            }
        }
    }
    
    package State;
    
    public class RunState extends State{
    
        @Override
        public void Run(Train train) {
            // TODO Auto-generated method stub
            if(train.isGiveWay())
            {
                train.setState(new StopState());
                train.Run();
            }
            else
            {
                System.out.println("当前时速为:" + train.getSpeed()
                + "列车正在匀速行驶");
            }
        }
    }
    
    package State;
    
    public class StopState extends State{
    
        @Override
        public void Run(Train train) {
            // TODO Auto-generated method stub
            System.out.println("当前时速为:" + train.getSpeed()
            + "列车正在停止,准备让行");
        }
    }
    
    package State;
    
    public class client {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Train train = new Train();
            train.setSpeed(0);
            train.Run();
            
            train.setSpeed(100);
            train.Run();
            train.setSpeed(150);
            train.Run();
            train.setSpeed(210);
            train.Run();
            train.setSpeed(200);
            train.Run();
            
            train.setGiveWay(true);;
            train.Run();
        }
    }
    

    一个对象的状态指的就是这个对象的属性值的组合,如果我们改变了这些属性的任意一个,这个对象的状态就发生了改变。
    状态模式适用于以下情况:

    1. 一个对象的行为取决于它的状态,并且他必须在运行时刻根据状态来改变自己的行为
    2. 当一个操作含有大量的多分支条件语句,并且这些分支都依赖于对象的状态时。

    相关文章

      网友评论

        本文标题:设计模式笔记(16)--状态模式

        本文链接:https://www.haomeiwen.com/subject/fcgvsftx.html