Game Programming Patterns / Паттерны программирования в играх: 1.3. Observer

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

class Subject

kamillxiii 01.05.14 в 11:15

1

{

kamillxiii 01.05.14 в 11:15

1

private:

kamillxiii 01.05.14 в 11:15

1

Observer* observers_[MAX_OBSERVERS];

kamillxiii 01.05.14 в 11:15

1

int numObservers_;

kamillxiii 01.05.14 в 11:15

1

};

kamillxiii 01.05.14 в 11:15

1

В реальном коде вам лучше использовать динамическую коллекцию вместо простого массива.

kamillxiii 01.05.14 в 11:17

1

В реальном коде используется динамически расширяемая коллекция вместо простого массива.

IngaJolly 17.06.14 в 18:23

0

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

kamillxiii 01.05.14 в 11:19

1

Здесь я придерживаюсь основ ради людей, пришедших из других языков программирования, не знающих стандартной библиотеки C++.

IngaJolly 17.06.14 в 18:24

0

Важным моментом является то, что субъект предоставляет публичное API для изменения этого списка.

kamillxiii 01.05.14 в 11:19

1

Важный момент: субъект предоставляет публичный API для изменения списка:

IngaJolly 17.06.14 в 18:25

0

class Subject

kamillxiii 01.05.14 в 11:15

1

{

kamillxiii 01.05.14 в 11:15

1

public:

kamillxiii 01.05.14 в 11:15

1

void addObserver(Observer* observer)

kamillxiii 01.05.14 в 11:15

1

{

kamillxiii 01.05.14 в 11:15

1

// Добавить в список...

kamillxiii 01.05.14 в 11:20

1

// Добавить в массив...

IngaJolly 17.06.14 в 18:26

0

}

kamillxiii 01.05.14 в 11:15

1

void removeObserver(Observer* observer)

kamillxiii 01.05.14 в 11:15

1

{

kamillxiii 01.05.14 в 11:15

1

// Удалить из списка...

kamillxiii 01.05.14 в 11:21

1

// Удалить из массива...

IngaJolly 17.06.14 в 18:26

0

}

kamillxiii 01.05.14 в 11:15

1

// Все остальное...

kamillxiii 01.05.14 в 11:22

1

// Остальные данные...

IngaJolly 17.06.14 в 18:27

0

};

kamillxiii 01.05.14 в 11:15

1

Это позволяет контролировать, кто получает сообщения, вне этого кода.

kamillxiii 01.05.14 в 11:23

1

Теперь внешний код контролирует, кто получает уведомления.

IngaJolly 17.06.14 в 18:27

0

Субъект общается с наблюдателями, но не связан с ними.

kamillxiii 01.05.14 в 11:23

2

В нашем примере ни одна строчка физического кода не говорит о наличии достижений.

kamillxiii 01.05.14 в 11:25

1

В нашем примере в физическом коде не будет ни слова про достижения.

IngaJolly 17.06.14 в 18:28

0

Тем не менее, он все еще оповещает систему достижений.

kamillxiii 01.05.14 в 11:25

1

Тем не менее, уведомления все еще могут приходить системе достижений.

IngaJolly 17.06.14 в 18:29

0

Это очень умно со стороны шаблона.

kamillxiii 01.05.14 в 11:27

1

В этом хитрость данного паттерна.

IngaJolly 17.06.14 в 18:29

0

Также важно, что субъект имеет список наблюдателей вместо одного-единственного.

kamillxiii 01.05.14 в 11:27

1

Также важно, что у субъекта есть не один, а несколько наблюдателей.

IngaJolly 27.08.14 в 18:18

0

Это говорит нам о том, что наблюдатели завязаны явно друг на друга.

kamillxiii 01.05.14 в 11:29

1

Это позволяет избежать ситуации, когда наблюдатели неявно связаны друг с другом.

IngaJolly 28.08.14 в 16:50

0

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

kamillxiii 01.05.14 в 11:32

1

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

IngaJolly 28.08.14 в 16:56

0

Если бы субъект поддерживал только одного наблюдателя, то аудио движок заменил бы систему достижений.

kamillxiii 01.05.14 в 11:36

1

Если бы субъект поддерживал только одного наблюдателя, при регистрации звукового движка отменялась бы регистрация системы достижений.

IngaJolly 28.08.14 в 16:57

0

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

kamillxiii 01.05.14 в 11:37

0

Это значит, что две системы вмешивались бы в работу друг друга самым неприятным образом, ибо одна отключала бы другую.

IngaJolly 28.08.14 в 18:54

0

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

kamillxiii 03.05.14 в 03:07

1

Поддержка списка наблюдателей гарантирует независимость каждого из них от других.

IngaJolly 29.08.14 в 10:03

0

Каждый из них думает, что он единственный в мире следит за субъектом.

kamillxiii 03.05.14 в 03:09

1

Каждый думает, что он один следит за субъектом.

IngaJolly 29.08.14 в 10:12

0

Другой задачей субъекта является отправка оповещений:

kamillxiii 03.05.14 в 03:22

1

Другая задача субъекта - это отправка уведомлений:

IngaJolly 29.08.14 в 10:18

0

class Subject

kamillxiii 01.05.14 в 11:15

1

{

kamillxiii 01.05.14 в 11:15

1

protected:

kamillxiii 01.05.14 в 11:15

1

void notify(const Entity& entity, Event event)

kamillxiii 01.05.14 в 11:15

1

{

kamillxiii 01.05.14 в 11:15

1

for (int i = 0; i < numObservers_; i++)

kamillxiii 01.05.14 в 11:15

1

{

kamillxiii 01.05.14 в 11:15

1

observers_[i]->onNotify(entity, event)

kamillxiii 01.05.14 в 11:16

1

;

kamillxiii 01.05.14 в 11:16

1

}

kamillxiii 01.05.14 в 11:16

1

}

kamillxiii 01.05.14 в 11:16

1

// Все остальное...

kamillxiii 03.05.14 в 03:23

1

// Остальные данные...

IngaJolly 29.08.14 в 10:26

0

};

kamillxiii 01.05.14 в 11:16

1

Заметьте, этот код предполагает, что наблюдатели не будут менять список в процессе вызова onNotify().

kamillxiii 03.05.14 в 03:25

1

Отметим, что наблюдатели не должны изменять список в методах onNotify.

IngaJolly 29.08.14 в 16:33

0

Более надежным решением будет запрещать или изящно обрабатывать изменения такого рода.

kamillxiii 03.05.14 в 03:27

1

Более надежное решение - предотвращать или изящно обрабатывать одновременные изменения.

IngaJolly 29.08.14 в 17:01

0
Минутку...

← Предыдущая страница

Следующая страница →