среда, 4 марта 2015 г.

ПАТТЕРН КОМАНДА (COMMAND)

Паттерн Команда можно описать так... Есть пульт с кнопками. Нажатие на кнопку запускает выполнение абстрактной команды. Наследуемый класс от команды содержит в себе методы, которые управляют изменениями состояния объекта (например, этот класс включает и выключает свет).

Паттерн Команда инкапсулирует запрос в виде объекта, делая возможной параметризацию клиенстких объектов с другими запросами, организацию очереди или регистрацию запросов, а также поддержку отмены операций.


//  интерфейс комманды
    interface eiCommand
    {
        void Execute();
    }


// реализация класса управления коммандами
    class SimpleRemoteControl
    {
        private eiCommand slot;

        public SimpleRemoteControl()
        {

        }

        public void setCommand(eiCommand prmCommand)
        {
            slot = prmCommand;
        }

        public void buttonWasPresed()
        {
            slot.Execute();
        }
    }

//  конкретный класс объекта свет
    class Light
    {
        internal void on()
        {
            Console.WriteLine("Light is On");
            //throw new NotImplementedException();
        }
    }


// конкретный класс команды
    class ecLightOnCommand : eiCommand
    {
        private Light light;

        public ecLightOnCommand(Light prmLight)
        {
            this.light = prmLight;
        }

        public void Execute()
        {
            this.light.on();
        }
    }

// запускаем код 
        static void Main(string[] args)
        {
            SimpleRemoteControl remote = new SimpleRemoteControl();
            
            Light light = new Light();
            ecLightOnCommand lightOn = new ecLightOnCommand(light);

            GarageDoor garageDoor = new GarageDoor();
            ecGarageDoorOpenCommand garageDoorOpen = new ecGarageDoorOpenCommand(garageDoor);

            remote.setCommand(lightOn);
            remote.buttonWasPresed();

            remote.setCommand(garageDoorOpen);
            remote.buttonWasPresed();
        }

Комментариев нет:

Отправить комментарий