设计模式 <行为型> | 状态模式

状态模式(State Pattern)

状态模式能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。

结构图:

角色:

  1. 上下文(Context): 保存了对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。
  2. 状态(State):抽象状态类或者接口,定义一个或一组行为,表示该状态下的行为。
  3. 具体状态(Concrete States):具体状态,实现了State中定义的行为,达到不同状态下的不同行为。

适用场景:

  1. 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态来改变他的行为时。

优点:

  1. 每个状态的行为都被放在单独的类中,符合单一原则。
  2. 无需修改已有状态类和上下文就能引入新状态。符合开闭原则。

缺点:

  1. 代码复杂度增加。

代码(C#)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// 上下文(Context)
public class Switcher
{
private IState _state;

public Switcher()
{
_state = new Off();
}

/// <summary>
/// 亮灯
/// </summary>
public void SwitchOn()
{
_state.SwitchOn(this);
}

/// <summary>
/// 关灯
/// </summary>
public void SwitchOff()
{
_state.SwitchOff(this);
}


/// <summary>
/// 变动状态
/// </summary>
/// <param name="state"></param>
public void Set(IState state)
{
_state = state;
}

/// <summary>
/// 获取状态
/// </summary>
/// <returns></returns>
public IState Get()
{
return _state;
}
}

// 状态(State)
public interface IState
{
public void SwitchOn(Switcher switcher);

public void SwitchOff(Switcher switcher);
}

// 具体状态(Concrete States)
public class On : IState
{
public void SwitchOn(Switcher switcher)
{
Console.WriteLine("亮灯");
switcher.Set(new Off());
}

public void SwitchOff(Switcher switcher)
{
Console.WriteLine("已经亮灯");
}
}
// 具体状态(Concrete States)
public class Off : IState
{
public void SwitchOn(Switcher switcher)
{
Console.WriteLine("已经熄灯");
}

public void SwitchOff(Switcher switcher)
{
Console.WriteLine("熄灯");
switcher.Set(new On());
}
}


最后

状态模式是状态机的一种实现方式。


设计模式 <行为型> | 状态模式
http://example.com/posts/39447.html
作者
她微笑的脸y
发布于
2023年3月10日
许可协议