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

版权声明:免费赠送更多微商营销课程,请关注公众号[开店]! https://blog.csdn.net/gzw1623231307/article/details/56475418



【状态模式】(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秒看看

----------
没雨下
好大太阳
太阳, 出去走走




















猜你喜欢

转载自blog.csdn.net/gzw1623231307/article/details/56475418