状态模式

参考文章:

https://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html

 

定义:

 当一个对象的内在状态改变时允许改变其行为

 

uml类图:

模式组成:

  • Contex(上下文):是一个类,它可以拥有一些内部状态
  • State(状态抽象):定义了一个所有具体状态的共同接口;任何状态都实现这个相同的接口,这样一来,状态之间可以互相替换
  • ConcreteState(具体状态): 处理来自Context的请求.每个ConcreteState都提供了它自己对于请求的实现.所以,当Context改变状态时行为也跟着改变

 

优点:

  • 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来
  • 所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换
  • 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

 

应用:

 

举个栗子:

 

定义一个上下文 (灯,它的内部状态是 开或者关)

class Light {
    State state=new OffState();

    public void press() {
        state.press(this);
    }

    public void turnOff() {
    }

    public void turnOn() {
    }
    public State getState() {
        return state;
    }
}

定义状态的抽象角色

interface State {
	public String getName();
	public void press(Light light);
}

 定义状态的具体实现 (开)

class OnState implements State {

    @Override
    public void press(Light light) {
        light.turnOff();
        light.state = new OffState();

    }

    @Override
    public String getName() {
        return "on";
    }

}

定义状态的具体实现(关)

class OffState implements State {

    @Override
    public void press(Light light) {
        light.turnOn();
        light.state = new OnState();
    }

    @Override
    public String getName() {
        return "off";
    }

}

上下文调用 (按两次按钮)

    public static void main(String[] args) {
        Light light=new Light();
        System.out.println("灯的状态是:"+light.getState().getName());
        light.press();
        System.out.println("灯的状态是:"+light.getState().getName());
        light.press();
        System.out.println("灯的状态是:"+light.getState().getName());
    }

输出

posted @ 2017-12-07 20:21  情歌z  阅读(147)  评论(0编辑  收藏  举报