Давайте попробуем сравнить шаблон наблюдателя с «ручной» системой уведомления объекта ... Я уверен, что все были виноваты в этом, когда начали программировать.
public class GameX{
public function GameX(){
var b = new Button(this); //we send a reference to button
}
public function buttonAction(){
//do something based on this
}
}
public class Button(){
private var listener:
public function Button(listener:GameX){
this.listener = listener;
someButtonThing();
}
public someButtonThing(){
listener.buttonAction();
}
}
Позволяет перебирать проблемы, с которыми можно столкнуться с этим кодом ...
1) Я хочу использовать класс Button в другой игре, GameY? Это проблема?
Конечно, скомпилируйте зависимость времени от GameX внутри класса кнопок ... да, вы можете изменить это или обмануть каким-то другим способом, но это нелегко или стандартизировано ... и стандартизация, вероятно, является одной из ключевых вещей модели наблюдателя ... почему это так хорошо. Это также нарушает инкапсуляцию ... подробнее об этом в секунду.
2) Я хочу слушать одновременно GameYComponent1 и GameYComponent2! Могу ли я это сделать?
Опять же, вы можете «обмануть» и изменить этот код, но опять же, вы должны изменить класс Button, и, опять же, он не будет столь же стандартизирован, как шаблон наблюдателя (вещь событий). И много раз вы просто не можете ... лучшее, что вы можете сделать, это подкласс от него. Чтобы много работать. Также не стандартизировано.
3) Вам нужен какой-то очень сложный механизм отправки событий, например, список экранных объектов в as3 имеет (извините, сейчас я не могу найти хорошую ссылку для этого в сети, если кто-то может отредактировать это позже, пожалуйста, добавьте ссылку в).
Я мог бы повторяться до завтрашнего дня, и есть люди, которые могут объяснить это лучше меня, но, по сути, отказ от использования шаблона наблюдателя, вероятно, нарушит инкапсуляцию и заставит вас изменять класс Button снова и снова ... это также не так стандартизирован, как события ... нет необходимости заново изобретать колесо, шаблон наблюдателя был создан для решения подобных проблем.
В любом случае, так я бы объяснил парню, который впервые за 15 минут программировал, зачем использовать события или пользовательские события. Это позволяет избежать головной боли для всех участников.
Для более всестороннего изучения, пожалуйста, воспользуйтесь этими ссылками (я только что обмолвился об этих вещах, но здесь должна быть доля правды):
Если у кого-то есть больше, лучше добавить ссылки, не стесняйтесь.
Кроме того, это хорошо, потому что немного помогает с инкапсуляцией, чем меньше класс Button знает о мире, и наоборот, тем лучше (не вдаваясь в подробности, и опять же, кто-то может объяснить это лучше):
Если у кого-то есть больше, лучше добавить ссылки, не стесняйтесь.
Кроме того, что-то, что я продолжаю упоминать, но не в деталях, каждый с небольшим опытом понимает события и может следить за ними. События могут затруднить понимание кода для новых программистов, и им труднее следовать по сравнению с конкретными ссылками, но затраты перевешивают преимущества. Вот что я имею в виду, когда говорю, что стандартизация модели наблюдателя, вероятно, является одним из ключей ее важности.
Скажите, имеет ли это для вас смысл.