Корректная реализация шаблона проектирования "Состояние" aka "State"

Подскажите, где я ошибаюсь. Есть задача - написать программу-симулятор включения и выключения ПК. Симуляция этих операций будет приближена к реальности, но не доподлинно. В комментариях подсказали использовать шаблон поведения"Состояние". Вот, что у меня получилось. Структура проекта

структура проекта

Реализация Computer

internal class Computer
    {
        public IPCState State { get; set; }

        public Computer() { }

        public Computer(IPCState state) => State = state;

        public bool TurnOn() => State.TurnON(this);

        public bool TurnOff() => State.TurnOff(this);
    }

Интерфейс IPCState

    internal interface IPCState
    {
        bool TurnON(Computer computer);

        bool TurnOff(Computer computer);
    }

Пример реализации одно из классов-загрузчиков

internal class LoaderOfTheSecondLevel : IPCState
    {
        // Передача управления исполняемому коду, записанному в PBS (Partition Boot Sector - загрузочный сектор активного раздела)
        internal bool IsPBSActive { get; private set; }

        public LoaderOfTheSecondLevel() { }

        public LoaderOfTheSecondLevel(bool state) => IsPBSActive = state;

        public bool TurnOff(Computer computer)
        {
            throw new NotImplementedException();
        }

        public bool TurnON(Computer computer)
        {
            if (IsPBSActive)
            {
                computer.State = new LoaderOfTheThirdLevel();
                return true;
            }
            else
            {
                return false;
            }
        }
    }

Уверен, что делаю что-то не так, потому что как видно из кода выше, я делаю зачем-то computer.State = new LoaderOfTheThirdLevel();, но потом нигде не использую. Делаю потому, что в примере на метаните было что-то похожее.

Ну и Main

List<bool> operationRes = new List<bool>();

            PowerSocket.SetElectricityState(true);
            Computer computer = new Computer(new SystemStartup());
            operationRes.Add(computer.TurnOn());
            computer = new Computer(new LoaderOfTheFirstLevel());
            operationRes.Add(computer.TurnOn());
            computer = new Computer(new LoaderOfTheSecondLevel(operationRes.Last()));
            operationRes.Add(computer.TurnOn());
            computer = new Computer(new LoaderOfTheThirdLevel(operationRes.Last()));
            operationRes.Add(computer.TurnOn());
            computer = new Computer(new BootLoaderOSKernel(operationRes.Last()));
            operationRes.Add(computer.TurnOn());

            if (operationRes.All(r => r))
            {
                Console.WriteLine("OS is ready to work");
            }
            else
            {
                Console.WriteLine("Error");
            }

            Console.ReadLine();
        }

Расскажите, что делаю не так.


Ответы (0 шт):