Связь между объектом и его членами - PullRequest
2 голосов
/ 22 января 2012

У меня есть глубокий вопрос об архитектуре ООП.

Как правильно общаться между объектом и его членами?

Позвольте мне объяснить, что я имею в виду, на некоторых примерах. (Я использую C ++, но это вообще не связано с вопросом.)

class Shield
{
    int toughness;
    //...

    void broke();
};

class Human
{
    String name;
    int age;
    //...
    Shield my_shield;

    void scream();
    void equip_shield(Shield);
};

Human vadim;
Shield aegis;

vadim.equip_shield(aegis);
aegis.destroy();

Итак, теперь я хочу, чтобы человек кричал каждый раз, когда его или ее щит разрушен. Но у щита нет способа вызвать метод его владельца. Он просто не знает, кто его владелец.

Еще один пример.

class Human
{
    //...
    void die();

};

class Crowd
{
    vector<Humans> people;
    //...
};

Итак, теперь я хочу, чтобы толпа сказала всем людям покинуть ее, если в толпе менее 10 человек. Толпа может сказать такие команды, но эта проверка должна выполняться каждый раз, когда кто-то умирает в толпе. Итак, опять же, человек должен как-то сообщить толпе, что он или она мертв, и попросить толпу перепроверить количество людей в нем.

Четкий способ разобраться в этой ситуации - сохранить указатель на толпу в каждом человеке. Но это свалка, потому что людей может быть много. Также здесь есть проблема синхронизации (та же самая проблема, фактически, как толпа может знать о факте, который оставил Джон?).

Я считаю, что существует какой-то триггерный механизм для решения подобных проблем.

Спасибо.

1 Ответ

3 голосов
/ 22 января 2012

То, что вы ищете, это образец наблюдателя .

По схеме наблюдателя толпа подписывается на людей в толпе, и когда человек испускает статус «смерти», он может перепроверить счет.

Точно так же и для щита, который мог запустить событие «сломан щит», который человек мог бы распознать и начать кричать.

...