Когда вы говорите «знать», вы правы, что издатель должен знать о наблюдателе, чтобы публиковать информацию для него.
Однако ему не нужно «знать» об этом вощущение, что это жестко закодировано, что:
- Наблюдатель всегда будет этим конкретным классом
- Всегда будут доступны эти конкретные наблюдатели
В своей основной форме события являются издателем / наблюдателем в игре, поэтому вы можете легко сделать это только с событиями:
public class Observer
{
}
public class Publisher
{
public event EventHandler SomethingHappened;
}
Затем вы заставите наблюдателя обработать это событие:
public class Observer
{
public Observer(Publisher pub)
{
pub.SomethingHappened += Publisher_SomethingHappened;
}
private void Publisher_SomethingHappened(object sender, EventArgs e)
{
}
}
public class Publisher
{
public event EventHandler SomethingHappened;
}
Всякий раз, когда это событие поднимается издателем, наблюдатель информируется об этом.Поймите, что действие по подключению к событию состоит в том, чтобы «рассказать» этому классу о наблюдателе, но издатель не имеет никакой жестко запрограммированной информации об издателе, за исключением того, что кто-то там слушает.
Aдругим способом было бы использовать интерфейсы:
public class Observer : IObserver
{
public Observer(Publisher pub)
{
pub.Observers.Add(this);
}
void IObserver.SomethingHappened()
{
}
}
public class Publisher
{
public List<IObserver> Observers { get; private set; }
}
public interface IObserver
{
void SomethingHappened();
}
Опять же, издатель будет «знать» о наблюдателе в том смысле, что у него есть ссылка на него, но опять же у него нет жестко закодированной информации о том, какой класс или какбудет много случаев.
Просто предостережение: приведенный выше код очень некорректен, как минимум вы должны убедиться, что наблюдатель «отцепит» от издателя, когда вы закончите, иначе выбудет иметь утечки в системе.Если вы не понимаете, что я имею в виду, оставьте комментарий, и я отредактирую пример.