状态模式(State)----行为笔记

来源:互联网 发布:php cookie自动登录 编辑:程序博客网 时间:2024/06/06 00:03



【状态模式】(State)当一个对象的内部状态改变时,改变其行为。看起来就好像改变了它的类一样。



一、涉及角色
【抽象状态】(State):状态接口,用于封装 环境对象(Context) 的一个特定状态所对应的行为。
【具体状态】(ConcreteState):具体状态类,封装实现了 环境对象(Context) 状态所对应的行为。
【环境角色】(Context):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。即现有状态。


二、优点与缺点
优点:将状态涉及的业务行为封装在具体状态类,使业务行为局域化。减少条件判断语句。新状态可直接添加,不影响其他代码。


缺点:可能有很多小状态类。




三、何时使用:
一个对象的行为(方法),依赖于它所处的状态。这个行为必须随着状态的改变而改变。
一重或多重条件判断语句,而且条件内的业务代码又较长。


【谁来判定状态的变化?】
1、如果条件是固定的,可由Context角色来做。
2、如果让State子类自行判定下一个状态,和什么时候转换,就更有灵活性。
3、也可以交由外部事件触发状态转移。
4、按需创建状态类,动态创建。




跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。 


状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。


http://blog.csdn.net/xxb2008




State角色

public interface State {    void rain();    void sun();    void travel(Context context);}


状态1

public class RainState implements State {    @Override    public void rain() {        System.out.println("下雨ing...");    }    @Override    public void sun() {        System.out.println("下雨, 没太阳");    }    @Override    public void travel(Context context) {        rain();        sun();        System.out.println("下雨, 不出去, 等2秒看看");        try {            Thread.sleep(2000);        } catch (Exception e) {            e.printStackTrace();        }        context.setState(new SunState());//切换状态    }}

状态2

public class SunState implements State {    @Override    public void rain() {        System.out.println("没雨下");    }    @Override    public void sun() {        System.out.println("好大太阳");    }    @Override    public void travel(Context context) {        rain();        sun();        System.out.println("太阳, 出去走走");    }}


Context环境角色

public class Context {    State state;    public void travel() {        state.travel(this);    }    public State getState() {        return state;    }    public void setState(State state) {        this.state = state;    }    public static void main(String[] args) {        Context context = new Context();        context.setState(new RainState());        context.travel();        System.out.println("");        System.out.println("----------");        context.travel();    }}


下雨ing...下雨, 没太阳下雨, 不出去, 等2秒看看----------没雨下好大太阳太阳, 出去走走




















0 0
原创粉丝点击