PatternsCSharpExtraAddons/Patterns/Pattern_8-Состояние/Program.cs

165 lines
5.0 KiB
C#
Raw Normal View History

2024-10-05 09:30:14 +03:00
/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_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);
}
}