защищенный Observer
От: xlend  
Дата: 30.05.07 15:37
Оценка:
Допустим, у нас есть Observer из Гаммы, который выглядит вот так (упрощенно):

class Subject;

class Subject
{
        Observer &e;

public:
        Subject(Observer &e): e(e) {}

        void Act()
        {
                e.Update();
        }
};

class Observer
{
public:
        void Update()
        {
                std::cout << "update\n";
        }
};


Не нравится мне то, что пользователь может вызвать Update тогда, когда это не нужно. Поэтому решено было Update сделать приватным, а Observer — другом Subject. Чтобы закрыть остальные данные от Subject, создаем предка Observer, которому прописываем другом Subject и объявляем там абстрактный метод Update():


class Subject;

class SubjectEvent
{
public:
        virtual void Update() {}
friend class Subject;
};

class Subject
{
        SubjectEvents &e;

public:
        Subject(SubjectEvent &e): e(e) {}

        void Act()
        {
                e.Update();
        }
};

class Observer : public SubjectEvent
{
        void Update()
        {
                std::cout << "update\n";
        }
public:

};


Так вот в чем вопрос: насколько оправдано использование friend в этом случае? (А нельзя ли сделать по другому?)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.