PatternsCSharpExtraAddons/Patterns/Pattern_8-Состояние/Program.cs
Dvurechensky a4cd4b4ced 1.0
Main
2024-10-05 09:30:14 +03:00

165 lines
5.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_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);
}
}