设计模式-状态模式

来源:互联网 发布:vs运行c语言 编辑:程序博客网 时间:2024/06/11 05:09

定义:又称状态对象模式,允许一个对象内部状态改变时,改变其行为胡模式。是一种对象的行为模式。

状态模式胡角色:(1)环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。此实例给出此环境对象的现有状态。(2)抽象状态角色:定义一个接口,封装一个环境对象特定状态对应的行为。(3)具体状态角色:每一个具体状态类都实现了环境对象的一个状态所对应的行为。
//环境角色    public class Context{        private State state;//持有抽象状态角色胡实例        public void setState(State state){            this.state = state;        }        //定义客户端感兴趣的接口        public void request(String param){            state.handle(param);        }           }    //抽象状态角色    public interface State{        //状态对应的处理        public void handle(String param);    }    //具体状态角色    public class ConcreteStateA implements State{        @Override        public void handle(String param){            System.out.println("ConcreteStateA handle :"+param);        }    }    public class ConcreteStateB implements State{        @Override        public void handle(String param){            System.out.println("ConcreteStateB handle :"+param);        }    }    //客户端    public class Client{        public static void main(String[] args){            State state = new ConcreteStateB();            Context context = new Context();            context.setState(state);            context.request("test");        }    }
蓝球运动员投球状态:正常发挥,不正常发挥,超常发挥
//定义状态影响的行为(抽象状态角色)    public interface State{        public void shot();    }    //定义具体状态对应的具体行为    public class NormalState implements State{        private String name;        public NormalState(String name){            this.name = name;        }        @Override        public void shot(){            System.out.println(name+"正常发挥:投中1个!");        }    }    public class NonormalState implements State{        private String name;        public NonormalState(String name){            this.name = name;        }        @Override        public void shot(){            System.out.println(name+"不正常发挥:一个也没投中!!!");        }    }    public class SuperState implements State{        private String name;        public SuperState(String name){            this.name = name;        }        @Override        public void shot(){            System.out.println(name+"超常发挥:投中2个,好牛逼!!!");        }    }    //环境角色    public class Player{        private String name;        //默认运动员为正常状态        public State state;        public Player(String name){            this.name = name;            state = new NormalState(this.name);        }        //在这里设置运动员真实的状态        public void setState(State state){            this.state = state;        }        public void shot(){            state.shot();        }        public String getName(){            return name;        }    }    //测试代码    public class ClientTest{        public static void main(String[] args){            Player player = new Player("张继科");            player.shot(); //张继科正常发挥            State state = new NonormalState(player.getName());            player.setState(state);            player.shot();//张继科不正常发挥            State superState = new SuperState(player.getName());            player.setState(superState);            player.shot();//张继科超常发挥        }    }
状态模式的功能就是分离状态的行为,通过维护状态的变化,来调用不同状态对应的不同功能。状态决定行为。状态模式中,环境类是持有状态的对象,状态模式就是将环境中的状态和与状态相关的行为抽象出去,使之可以独立变化。优点是新增状态时,易扩展,缺点是具体状态类可能会过多。
0 0