|
1 |
| -using System; |
| 1 | +// EN: State Design Pattern |
| 2 | +// |
| 3 | +// Intent: Allow an object to alter its behavior when its internal state |
| 4 | +// changes. The object will appear to change its class. |
| 5 | +// |
| 6 | +// RU: Паттерн Состояние |
| 7 | +// |
| 8 | +// Назначение: Позволяет объекту менять поведение при изменении его внутреннего |
| 9 | +// состояния. Со стороны может казаться, что объект меняет свой класс. |
| 10 | + |
| 11 | +using System; |
2 | 12 |
|
3 | 13 | namespace RefactoringGuru.DesignPatterns.State.Conceptual
|
4 | 14 | {
|
| 15 | + // EN: The Context defines the interface of interest to clients. It also |
| 16 | + // maintains a reference to an instance of a State subclass, which represents |
| 17 | + // the current state of the Context. |
| 18 | + // |
| 19 | + // RU: Контекст определяет интерфейс, представляющий интерес для клиентов. Он |
| 20 | + // также хранит ссылку на экземпляр подкласса Состояния, который отображает |
| 21 | + // текущее состояние Контекста. |
5 | 22 | class Context
|
6 | 23 | {
|
| 24 | + // EN: A reference to the current state of the Context. |
| 25 | + // |
| 26 | + // RU: Ссылка на текущее состояние Контекста. |
7 | 27 | private State _state = null;
|
8 | 28 |
|
9 | 29 | public Context(State state)
|
10 | 30 | {
|
11 |
| - this.transitionTo(state); |
| 31 | + this.TransitionTo(state); |
12 | 32 | }
|
13 | 33 |
|
14 |
| - public void transitionTo(State state) |
| 34 | + // EN: The Context allows changing the State object at runtime. |
| 35 | + // |
| 36 | + // RU: Контекст позволяет изменять объект Состояния во время выполнения. |
| 37 | + public void TransitionTo(State state) |
15 | 38 | {
|
16 |
| - Console.Write("Context: Transition to " + state.ToString() + ".\n"); |
| 39 | + Console.WriteLine($"Context: Transition to {state.GetType().Name}."); |
17 | 40 | this._state = state;
|
18 |
| - this._state.setContext(this); |
| 41 | + this._state.SetContext(this); |
19 | 42 | }
|
20 | 43 |
|
21 |
| - public void request1() |
| 44 | + // EN: The Context delegates part of its behavior to the current State |
| 45 | + // object. |
| 46 | + // |
| 47 | + // RU: Контекст делегирует часть своего поведения текущему объекту |
| 48 | + // Состояния. |
| 49 | + public void Request1() |
22 | 50 | {
|
23 |
| - this._state.handle1(); |
| 51 | + this._state.Handle1(); |
24 | 52 | }
|
25 | 53 |
|
26 |
| - public void request2() |
| 54 | + public void Request2() |
27 | 55 | {
|
28 |
| - this._state.handle2(); |
| 56 | + this._state.Handle2(); |
29 | 57 | }
|
30 | 58 | }
|
31 | 59 |
|
| 60 | + // EN: The base State class declares methods that all Concrete State should |
| 61 | + // implement and also provides a backreference to the Context object, associated |
| 62 | + // with the State. This backreference can be used by States to transition the |
| 63 | + // Context to another State. |
| 64 | + // |
| 65 | + // RU: Базовый класс Состояния объявляет методы, которые должны реализовать все |
| 66 | + // Конкретные Состояния, а также предоставляет обратную ссылку на объект |
| 67 | + // Контекст, связанный с Состоянием. Эта обратная ссылка может использоваться |
| 68 | + // Состояниями для передачи Контекста другому Состоянию. |
32 | 69 | abstract class State
|
33 | 70 | {
|
34 |
| - protected Context context; |
| 71 | + protected Context _context; |
35 | 72 |
|
36 |
| - public void setContext(Context context) |
| 73 | + public void SetContext(Context context) |
37 | 74 | {
|
38 |
| - this.context = context; |
| 75 | + this._context = context; |
39 | 76 | }
|
40 | 77 |
|
41 |
| - public abstract void handle1(); |
| 78 | + public abstract void Handle1(); |
42 | 79 |
|
43 |
| - public abstract void handle2(); |
| 80 | + public abstract void Handle2(); |
44 | 81 | }
|
45 | 82 |
|
| 83 | + // EN: Concrete States implement various behaviors, associated with a state of |
| 84 | + // the Context. |
| 85 | + // |
| 86 | + // RU: Конкретные Состояния реализуют различные модели поведения, связанные с |
| 87 | + // состоянием Контекста. |
46 | 88 | class ConcreteStateA : State
|
47 | 89 | {
|
48 |
| - public override void handle1() |
| 90 | + public override void Handle1() |
49 | 91 | {
|
50 |
| - Console.Write("ConcreteStateA handles request1.\n"); |
51 |
| - Console.Write("ConcreteStateA wants to change the state of the context.\n"); |
52 |
| - this.context.transitionTo(new ConcreteStateB()); |
| 92 | + Console.WriteLine("ConcreteStateA handles request1."); |
| 93 | + Console.WriteLine("ConcreteStateA wants to change the state of the context."); |
| 94 | + this._context.TransitionTo(new ConcreteStateB()); |
53 | 95 | }
|
54 | 96 |
|
55 |
| - public override void handle2() |
| 97 | + public override void Handle2() |
56 | 98 | {
|
57 |
| - Console.Write("ConcreteStateA handles request2.\n"); |
| 99 | + Console.WriteLine("ConcreteStateA handles request2."); |
58 | 100 | }
|
59 | 101 | }
|
60 | 102 |
|
61 | 103 | class ConcreteStateB : State
|
62 | 104 | {
|
63 |
| - public override void handle1() |
| 105 | + public override void Handle1() |
64 | 106 | {
|
65 |
| - Console.Write("ConcreteStateB handles request1.\n"); |
| 107 | + Console.Write("ConcreteStateB handles request1."); |
66 | 108 | }
|
67 | 109 |
|
68 |
| - public override void handle2() |
| 110 | + public override void Handle2() |
69 | 111 | {
|
70 |
| - Console.Write("ConcreteStateB handles request2.\n"); |
71 |
| - Console.Write("ConcreteStateB wants to change the state of the context.\n"); |
72 |
| - this.context.transitionTo(new ConcreteStateA()); |
| 112 | + Console.WriteLine("ConcreteStateB handles request2."); |
| 113 | + Console.WriteLine("ConcreteStateB wants to change the state of the context."); |
| 114 | + this._context.TransitionTo(new ConcreteStateA()); |
73 | 115 | }
|
74 | 116 | }
|
75 | 117 |
|
76 |
| - class Program |
| 118 | + class Client |
77 | 119 | {
|
78 |
| - static void Main(string[] args) |
| 120 | + public static void ClientCode() |
79 | 121 | {
|
80 |
| - Client.ClientCode(); |
| 122 | + // EN: The client code. |
| 123 | + // |
| 124 | + // RU: Клиентский код. |
| 125 | + var context = new Context(new ConcreteStateA()); |
| 126 | + context.Request1(); |
| 127 | + context.Request2(); |
81 | 128 | }
|
82 | 129 | }
|
83 |
| - |
84 |
| - class Client |
| 130 | + |
| 131 | + class Program |
85 | 132 | {
|
86 |
| - public static void ClientCode() |
| 133 | + static void Main(string[] args) |
87 | 134 | {
|
88 |
| - var context = new Context(new ConcreteStateA()); |
89 |
| - context.request1(); |
90 |
| - context.request2(); |
| 135 | + Client.ClientCode(); |
91 | 136 | }
|
92 | 137 | }
|
93 | 138 | }
|
0 commit comments