165 lines
5.0 KiB
C#
165 lines
5.0 KiB
C#
|
/*
|
|||
|
* ПАТТЕРНЫ ПОВЕДЕНИЯ
|
|||
|
*
|
|||
|
* Глава_7_2: Состояние
|
|||
|
*
|
|||
|
* - позволяет объекту поменять свое поведение в зависимости от состояния
|
|||
|
*/
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Объектное представление логического состояния
|
|||
|
/// </summary>
|
|||
|
interface IState
|
|||
|
{
|
|||
|
void SetStateTrue(Variable v);
|
|||
|
void SetStateFalse(Variable v);
|
|||
|
}
|
|||
|
|
|||
|
class Variable
|
|||
|
{
|
|||
|
IState value;
|
|||
|
public Variable()
|
|||
|
{
|
|||
|
value = new StateFalse();
|
|||
|
}
|
|||
|
public void SetState(IState state) => value = state;
|
|||
|
public void False() => value.SetStateFalse(this);
|
|||
|
public void True() => value.SetStateTrue(this);
|
|||
|
public override string ToString() => value.ToString();
|
|||
|
}
|
|||
|
|
|||
|
class StateFalse : IState
|
|||
|
{
|
|||
|
public void SetStateFalse(Variable v) { Console.WriteLine("Итак в лжи [False]"); }
|
|||
|
public void SetStateTrue(Variable v) => v.SetState(new StateTrue());
|
|||
|
public override string ToString() => "Current state: False";
|
|||
|
}
|
|||
|
|
|||
|
class StateTrue : IState
|
|||
|
{
|
|||
|
public void SetStateFalse(Variable v) => v.SetState(new StateFalse());
|
|||
|
public void SetStateTrue(Variable v) { Console.WriteLine("Итак в истине [True]"); }
|
|||
|
public override string ToString() => "Current state: True";
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// пример из реалной жизни
|
|||
|
/// </summary>
|
|||
|
class Camera : ICameraState
|
|||
|
{
|
|||
|
ICameraState state;
|
|||
|
public Camera() => state = new OffState();
|
|||
|
public void SetState(ICameraState state) => this.state = state;
|
|||
|
public void RecordVideo(Camera camera) => state.RecordVideo(camera);
|
|||
|
public void TakePictures(Camera camera) => state.TakePictures(camera);
|
|||
|
public void TurnOff(Camera camera) => state.TurnOff(camera);
|
|||
|
public void TurnOn(Camera camera) => state.TurnOn(camera);
|
|||
|
}
|
|||
|
|
|||
|
interface ICameraState
|
|||
|
{
|
|||
|
void TurnOn(Camera camera);
|
|||
|
void TurnOff(Camera camera);
|
|||
|
void TakePictures(Camera camera);
|
|||
|
void RecordVideo(Camera camera);
|
|||
|
}
|
|||
|
|
|||
|
class FotoState : ICameraState
|
|||
|
{
|
|||
|
public void RecordVideo(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Переходим в режим видео");
|
|||
|
camera.RecordVideo(camera);
|
|||
|
}
|
|||
|
|
|||
|
public void TakePictures(Camera camera) => Console.WriteLine("Камера уже в режиме фото");
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Выключить камеру
|
|||
|
/// </summary>
|
|||
|
/// <param name="camera">камера</param>
|
|||
|
public void TurnOff(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Нажата кнопка выключения");
|
|||
|
camera.SetState(new OffState());
|
|||
|
}
|
|||
|
|
|||
|
public void TurnOn(Camera camera) => Console.WriteLine("Камера уже включена");
|
|||
|
}
|
|||
|
|
|||
|
class VideoState : ICameraState
|
|||
|
{
|
|||
|
public void RecordVideo(Camera camera) => Console.WriteLine("Камера уже в режиме видео");
|
|||
|
|
|||
|
public void TakePictures(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Переходим в режим фото");
|
|||
|
camera.TakePictures(camera);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Выключить камеру
|
|||
|
/// </summary>
|
|||
|
/// <param name="camera">камера</param>
|
|||
|
public void TurnOff(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Нажата кнопка выключения");
|
|||
|
camera.SetState(new OffState());
|
|||
|
}
|
|||
|
|
|||
|
public void TurnOn(Camera camera) => Console.WriteLine("Камера уже включена");
|
|||
|
}
|
|||
|
|
|||
|
class OnState : ICameraState
|
|||
|
{
|
|||
|
public void RecordVideo(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Переходим в режим видео");
|
|||
|
camera.RecordVideo(camera);
|
|||
|
}
|
|||
|
|
|||
|
public void TakePictures(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Переходим в режим фото");
|
|||
|
camera.TakePictures(camera);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Выключить камеру
|
|||
|
/// </summary>
|
|||
|
/// <param name="camera">камера</param>
|
|||
|
public void TurnOff(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Нажата кнопка выключения");
|
|||
|
camera.SetState(new OffState());
|
|||
|
}
|
|||
|
|
|||
|
public void TurnOn(Camera camera) => Console.WriteLine("Камера уже включена");
|
|||
|
}
|
|||
|
|
|||
|
class OffState : ICameraState
|
|||
|
{
|
|||
|
public void RecordVideo(Camera camera) => Console.WriteLine("Камера ещё вылючена");
|
|||
|
public void TakePictures(Camera camera) => Console.WriteLine("Камера ещё вылючена");
|
|||
|
public void TurnOff(Camera camera) => Console.WriteLine("Камера уже вылючена");
|
|||
|
public void TurnOn(Camera camera)
|
|||
|
{
|
|||
|
Console.WriteLine("Нажата кнопка включения");
|
|||
|
camera.SetState(new OnState());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Program
|
|||
|
{
|
|||
|
public static void Main(string[] args)
|
|||
|
{
|
|||
|
Console.WriteLine("SimpleState.Something");
|
|||
|
var sv = new Variable();
|
|||
|
sv.True();
|
|||
|
Console.WriteLine(sv);
|
|||
|
sv.False(); Console.WriteLine(sv);
|
|||
|
sv.False(); Console.WriteLine(sv);
|
|||
|
sv.False(); Console.WriteLine(sv);
|
|||
|
sv.True(); Console.WriteLine(sv);
|
|||
|
}
|
|||
|
}
|