четверг, 5 марта 2015 г.

Полезные ссылки


Сайт, посвященный объектно-ориентированному анализу, проектированию и программированию: 
http://ooad.asf.ru/Patterns.aspx


Признаки плохого кода:

среда, 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();
        }

вторник, 3 марта 2015 г.

ПАТТЕРН ДЕКОРАТОР (DECORATOR)

Паттерн Декоратор можно описать так:

  • Берем объект "Кофе";
  • Декорируем его объектом "Сахар";
  • Декорируем его объектом "Молоко";
  • Вызываем метод cost и пользуемся делегированием для прибавления стоимости дополнений.
Паттерн Декоратор динамически наделяет объект новыми возможностями и является гибкой альтернативой субклассированию в области расширения функциональности.


// декорируемый объект
    abstract class ecDrink
    {
        public string _description = "Unknown beverage";

        public virtual string getDescription()
        {
            return _description;
        }

        public abstract double cost();

    }


// декоратор
    abstract class ecCondimentDecorator : ecDrink
    {

    }

//  конкретный класс декорируемого объекта
    class ecEspresso : ecDrink
    {
        public ecEspresso()
        {
            _description = "Espresso";
        }

        public override double cost()
        {
            return 1.99;
        }
    }


// конкретный класс декоратора
    class ecMocha : ecCondimentDecorator
    {
        private ecDrink drink;

        public ecMocha(ecDrink prmDrink)
        {
            this.drink = prmDrink;
        }


        public override string getDescription()
        {
            return drink.getDescription() + ", Mocha";
        }

        public override double cost()
        {
            return .20 + drink.cost();
        }
    }

понедельник, 2 марта 2015 г.

РЕАЛИЗАЦИЯ ПАТТЕРНА НАБЛЮДАТЕЛЬ (OBSERVER) НА СОБЫТИЯХ C#

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



// интерфейс издателя
    public delegate void eiSubjectEventHandler(eiSubject subject);

    public interface eiSubject
    {
        event eiSubjectEventHandler OnUpdate;

        void GenereteEventUpdate();

    }

// реализация класса издателя
    class ecSubject : eiSubject
    {
        private event eiSubjectEventHandler _OnUpdate = null;
        public event eiSubjectEventHandler OnUpdate
        {
            add
            {
                lock (this)
                {
                    _OnUpdate -= value;
                    _OnUpdate += value;
                }
            }
            remove { lock (this) { _OnUpdate -= value; } }
        }

        public void GenereteEventUpdate()
        {
            eiSubjectEventHandler handler = _OnUpdate;

            if (handler != null)
            {
                handler(this);
            }
        }

    }

// реализация интерфейса подписчика
    public interface eiObserver
    {
        void DoOnUpdate(eiSubject subject);

    }

// реализация класса подписчика
    class ecObserver : eiObserver
    {
        public virtual void DoOnUpdate(eiSubject subject)
        {
        }
    }


Это мой эксперементальный вариант.

ПАТТЕРН OBSERVER (ПАТТЕРН НАБЛЮДАТЕЛЬ)

Паттерн очень часто описывают как модель "издатель-подписчик".

  • Издатель открывает свое дело и начинает выпускать газету.
  • Вы оформляете подписку у этого издателя. Каждый раз когда выходит новый номер, он доставляется вам пока действует подписка.
  • Если вы больше не хотите получить газеты, вы прекращаете подписку.


Паттерн  Наблюдатель определяет отношение "один-ко-многим" между объектами таким образом, что при изменении состояния одного объекта происходит автоматическое оповещение и обновление всех зависимых.