Допустим, у нас есть 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 в этом случае? (А нельзя ли сделать по другому?)