/*
* ПАТТЕРНЫ ПОВЕДЕНИЯ
*
* Глава_7_2: Состояние
*
* - позволяет объекту поменять свое поведение в зависимости от состояния
*/
///
/// Объектное представление логического состояния
///
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";
}
///
/// пример из реалной жизни
///
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("Камера уже в режиме фото");
///
/// Выключить камеру
///
/// камера
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);
}
///
/// Выключить камеру
///
/// камера
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);
}
///
/// Выключить камеру
///
/// камера
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);
}
}