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

  1. 作为人类,当我们心情不错的时候,可能在各方面表现会更好,而当我们心情糟糕时,表现会更差。这样的道理可以应用到这个模式中,即当我们需要对象的状态改变而其行文发生变化,那么这个模式很易用
  2. 注意:如果状态的数量增加了这个系统的复杂度,那么会使得代码难以维护

思考

状态模式针对的对象,它应对不同状况采取的行为是要定义在其它类中(例子中的RemoteControl),对象本身会持有一个这样的类的对象,当它的状态被改变,它把自己传入到控制对象的方法中,此时执行的行为都是基于它改变过后的状态

posted on 2020-12-05 20:17  老鼠不上树  阅读(50)  评论(0)    收藏  举报