参考文章:
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()); }
输出