Если вы раньше не сталкивались с шаблоном Observer, возможно, инстинктивно думать, что все вызовы методов выполняются довольно статично - методы, которые мы вызываем в нашем коде, - это то, что вызывается. Тем не менее, шаблон наблюдателя позволяет вам делать вещи более динамично. Вы можете что-то сказать во время выполнения: «эй, когда происходит то-то и то-то, дайте мне знать! Вы можете дать мне знать, вызывая такой-то метод». «Наблюдаемый» ведет учет всех, кто сказал ему », когда такой и такое случается, дайте мне знать "- и тогда, когда это произойдет, оно делает именно это - дает всем знать. Это делается путем сохранения списка методов, которые должны быть вызваны, и последующего вызова их всех, когда событие «вызвано».
Линия:
server.ServerStatusChanged += new EventHandler(ProcessServerStatus);
сообщает объекту сервера «эй, когда статус сервера изменится, дайте мне знать. Вы можете сообщить мне об этом, вызвав метод ProcessServerStatus». И так, когда строка:
server.ServerStatus = true;
запускается, запускает событие ServerStatusChanged, которое затем вызывает все, что говорит «дай мне знать». Поэтому он вызовет метод ProcessServerStatus
, поскольку это единственный метод в его списке.
Каждый метод в этом списке должен иметь определенную сигнатуру метода; в этом случае void ProcessServerStatus(object sender, EventArgs e)
. Параметр sender
в этом случае является состоянием сервера - вы можете увидеть это в строке:
ServerStatusChanged(value, new EventArgs());
И поэтому, когда вызывается ProcessServerStatus
, он преобразует его в логическое значение и печатает соответствующую строку.
Когда я запускаю этот код, он работает как положено - если я закомментирую строку serverStatus = true;
, он ничего не печатает (поскольку по умолчанию _serverStatus имеет значение false, и событие не запускается, если состояние не изменилось). Вместо этого, если я закомментирую строку serverStatus = false;
, она скажет "сервер запущен и работает"