Observer - это средство разъединения, то есть ослабления связей между двумя объектами. Вы хотите этого, потому что это делает ваш код аккуратнее и проще в обслуживании. В этом и заключается цель всех шаблонов проектирования: легче читать, легче поддерживать код.
В этом шаблоне у вас есть два класса, два объекта: издатель и обозреватель. Publisher - это класс, который на самом деле выполняет некоторую работу, затем он часто вызывает методы у любых наблюдателей, чтобы сообщить им об этом. Он знает, какие классы вызывать, потому что хранит список наблюдателей, которые подписались.
Так что ваш издатель может выглядеть примерно так:
class Publisher
{
List<Observer> observers = new List<Observer>();
public Add(Observer o)
{
observers.Add(o);
}
private AlertObservers()
{
foreach(Observer o in observers)
{
o.Alert();
}
}
Издатель действительно выполняет большую часть работы. Все, что нужно сделать Наблюдателю - это добавить его в список и реализовать вызываемый метод. Вот так:
class Observer
{
public Observer(Publisher pub)
{
pub.Add(this);
}
public Alert()
{
System.Console.WriteLine("Oh no, stuff is happening!");
}
}
Это довольно скромное представление о том, как это работает. Теперь, почему это ценно? Выглядит довольно хорошо, да? Одна из причин этого заключается в том, что я не использую интерфейс, который позволил бы мне настроить многие классы с функциональностью Observer, и Publisher никогда не нужно знать о них больше ничего, кроме того, что они могут получать вызов Alert (). Также обратите внимание, что Publisher будет пытаться вызвать Alert для любого и всех Наблюдателей, которые у него есть, даже если у него их нет.
Теперь в мире C # язык имеет встроенную версию этого паттерна через свои объекты Event. События очень мощные и используют делегатов, что является способом передачи метода в качестве параметра при вызове другого метода. Они допускают некоторое серьезное разделение, но я бы оставил это для нового вопроса.