2024-10-05 09:30:14 +03:00
|
|
|
|
/*
|
2025-05-12 03:44:31 +03:00
|
|
|
|
* Author: Nikolay Dvurechensky
|
|
|
|
|
* Site: https://www.dvurechensky.pro/
|
|
|
|
|
* Gmail: dvurechenskysoft@gmail.com
|
|
|
|
|
* Last Updated: 12 мая 2025 03:39:52
|
|
|
|
|
* Version: 1.0.4
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|