Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2012, 15:43   #1
ilshat09
Пользователь
 
Регистрация: 10.07.2010
Сообщений: 37
По умолчанию Использование паттерна observer

Добрый день! Не могу решить такую проблему нужно из класса DataProviderColleague убрать жёсткую связь с классом Mediator используя
паттерн Observer
Вот код реализации:
Код:
class Program
    {
        class Mediator
        {
            private DataProviderColleague dataProvider;
            private DataConsumerColleague dataConsumer;
            public void IntroduceColleagues(DataProviderColleague c1, DataConsumerColleague c2)
            {
                dataProvider = c1;
                dataConsumer = c2;
            }
 
            public void DataChanged()
            {
                int i = dataProvider.MyData;
                dataConsumer.NewValue(i);
            }
        }
 
        class DataConsumerColleague
        {
            public void NewValue(int i)
            {
                Console.WriteLine("New value {0}", i);
            }
        }
 
        class DataProviderColleague
        {
            private Mediator mediator;
            private int iMyData = 0;
            public int MyData
            {
                get
                {
                    return iMyData;
                }
                set
                {
                    iMyData = value;
                }
            }
            public DataProviderColleague(Mediator m)
            {
                mediator = m;
            }
 
            public void ChangeData()
            {
                // iMyData = 403;
 
                if (mediator != null)
                    mediator.DataChanged();
            }
        }
 
        static void Main(string[] args)
        {
            Mediator m = new Mediator();
            DataProviderColleague c1 = new DataProviderColleague(m);
            DataConsumerColleague c2 = new DataConsumerColleague();
            m.IntroduceColleagues(c1, c2);
 
            c1.ChangeData();
            Console.ReadKey();
        }
    }
ilshat09 вне форума Ответить с цитированием
Старый 21.04.2012, 20:13   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Нужно сделать так, чтобы DataProviderColleague вообще не знал о существовании Mediator. Для этого он не должен явно вызывать mediator.DataChanged(), а должен предоставлять событие на которое медиатор должен подписываться самостоятельно. Для этого нужно:
1) добавить в DataProviderColleague событие; например, public event EventHandler DataChanged (но вместо EventHandler можно самостоятельно определить тип делегата, чтобы он ещё передавал какие-нибудь полезные данные);
2) метод DataProviderColleague.ChangeData() можно убрать вообще; вместо этого в тех местах, где изменяются данные, вызвать событие DataChanged (this, EventArgs.Empty) (не забыв проверить DataChanged на null, на случай, если никто ещё не подписан);
3) медиатор в своём конструкторе должен подписываться на событие: c1.DataChanged += DataChanged, а метод Mediator.DataChanged по своей сигнатуре (т. е по типу аргументов и возвращаемого значения) должен соответствовать событию EventHandler: public void DataChanged (object sender, EventArgs e).

Последний раз редактировалось ds.Dante; 21.04.2012 в 20:38.
ds.Dante вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование БД glazik БД в Delphi 13 22.02.2012 09:14
Реализация паттерна Singleton в случае наследование newkobra Общие вопросы C/C++ 6 05.11.2011 22:30
Использование (...) в с++ Byurrer Общие вопросы C/C++ 12 06.04.2011 23:04
патттерн Observer(Непонятна часть кода) С++ sasharu9 Помощь студентам 1 09.12.2010 03:58
Использование while и while do prikolist Общие вопросы C/C++ 20 06.04.2009 18:40