Alter an object’s behavior when its state changes.

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。


动机

一个对象,会根据不同的状态执行不同的响应。

适用性:一个对象的行为取决于它的状态,并且在状态改变的时候能够改变其行为;一个操作中有庞大的多条件分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常可以使用一个或者多个枚举常量表示。

结构和代码

  1. enum TCP_STATE {
  2. ESTABLISHED,
  3. LISTEN,
  4. CLOSED,
  5. }
  6. class TCPState {
  7. open() { };
  8. close() { };
  9. acknowledge() { };
  10. }
  11. class TCPEstablishedState extends TCPState { }
  12. class TCPListenState extends TCPState { }
  13. class TCPClosedState extends TCPState { }
  14. const STATE_MAP = {
  15. ESTABLISHED: TCPEstablishedState,
  16. LISTEN: TCPListenState,
  17. CLOSED: TCPClosedState,
  18. };
  19. class TCPConnection {
  20. private _state: TCPState;
  21. private _currentSate: TCP_STATE;
  22. changeState(state: TCP_STATE) {
  23. this._currentSate = state;
  24. this._state = new STATE_MAP[state];
  25. }
  26. open() {
  27. this._state.open();
  28. }
  29. close() {
  30. this._state.close();
  31. }
  32. acknowledge() {
  33. this._state.acknowledge();
  34. }
  35. }
  • 和状态机的感觉一致。
  1. let marry = new MarryState();
  2. marry
  3. .change('jump', 'short')
  4. .change('go', 2)
  5. .change('dive', 3)
  6. .change('win')

效果

  • 将特定状态相关的效果「局部化」,并将不同状态行为分割开来。
  • 也使得状态进行显示转化,同时 State 对象可以被共享。

实战

  • UI 编排中,编辑锁的状态管理;
  • single-spa 中对应用加载状态的管理;