State Patterns
GoF定义:使一个对象在其自身状态发生变化时其行为也对应发生变化。这个对象看起来像是改变了它的类
概念
用事实说话【滑稽】
例子
现实世界:想象在网络连接中,这里负责连接的对象会有很多种状态(正在连接、连接成功、连接关闭)
代码世界:假设一个系统只能处理固定数量个任务,那么当一个新任务来,它可能会处理这个任务,也可能会提示任务已满,当前不能处理这个任务
展示
本例中模拟了开关电视的操作
代码
public class StatePattern {
public static void main(String[] args) {
System.out.println("***State Pattern Demo***\n");
//Initially TV is Off
Off initialState = new Off();
TV tv = new TV(initialState);
//First time press
tv.pressButton();
//Second time press
tv.pressButton();
}
}
class TV {
private RemoteControl state;
public TV(RemoteControl state) {
this.state = state;
}
public RemoteControl getState() {
return state;
}
public void setState(RemoteControl state) {
this.state = state;
}
public void pressButton() {
this.state.pressSwitch(this);
}
}
abstract class RemoteControl {
abstract void pressSwitch(TV context);
}
class On extends RemoteControl {
@Override
void pressSwitch(TV context) {
System.out.println("I am already On .Going to be Off now");
context.setState(new Off());
}
}
class Off extends RemoteControl {
@Override
void pressSwitch(TV context) {
System.out.println("I am Off .Going to be On now");
context.setState(new On());
}
}
Note
- 作为人类,当我们心情不错的时候,可能在各方面表现会更好,而当我们心情糟糕时,表现会更差。这样的道理可以应用到这个模式中,即当我们需要对象的状态改变而其行文发生变化,那么这个模式很易用
- 注意:如果状态的数量增加了这个系统的复杂度,那么会使得代码难以维护
思考
状态模式针对的对象,它应对不同状况采取的行为是要定义在其它类中(例子中的RemoteControl),对象本身会持有一个这样的类的对象,当它的状态被改变,它把自己传入到控制对象的方法中,此时执行的行为都是基于它改变过后的状态