2009-04-21 4 views
1

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

Когда я выполняю код, я получаю оба сообщения «Сервер запущен и работает», а «Сервер не работает, мы работаем над этим, он скоро вернется». Я думаю, что получаю оба сообщения, потому что в Main есть сервер. ServerStatus = true; и server.ServerStatus = false. Однако, если я прокомментирую сервер.ServerStatus = true; и тогда я получаю сообщение «Сервер запущен и работает», но я ожидал увидеть только «Сервер не работает, мы работаем над этим, он скоро вернется». Может кто-нибудь объяснить? Susan

class Program 
{ 
    static void Main(string[] args) 
    { 
     Server server = new Server(); 
     server.ServerStatusChanged += new EventHandler(ProcessServerStatus); 
     server.ServerStatus = true; 
     server.ServerStatus = false; 
     Console.Read(); 
    } 


    public class Server 
    { 
     public event EventHandler ServerStatusChanged; 
     private bool _ServerStatus; 

     public bool ServerStatus 
     { 
      get { return this._ServerStatus; } 
      set { 
       if (this._ServerStatus == value) return; // Dont need to do anything; 
       if (this.ServerStatusChanged != null) // make sure the invocation list is not empty 
        ServerStatusChanged(value, new EventArgs()); // Firing Event 
       this._ServerStatus = value; 
      } 
     } 
    } 



    public static void ProcessServerStatus(object sender, EventArgs e) 
    { 
     bool status = (bool)sender; 
     if (status) 
      Console.WriteLine("Server is up and running"); 
     else 
      Console.WriteLine("Server is down, We are working on it it will be back soon"); 

    } 



} 
+1

Это помечено Java, но я думаю, что код на самом деле является C#. –

+0

Действительно, они получают {} set {}: s - это функция C#, а не Javas. Изменены теги. – Esko

ответ

0

Это регистрация событий ...

server.ServerStatusChanged += new EventHandler(ProcessServerStatus); 

Он говорит: "всякий раз, когда есть ServerStatusChanged, вызовите метод ProcesServerStatus." Итак, когда вы устанавливаете ServerStatus в true, вы получаете вызов ProcessServerStatus, передающий true, и он печатает «Server up ...»; когда вы меняете его на false, запускается другое событие, но на этот раз ServerStatus имеет значение false, поэтому вы получаете «Сервер опущен ...» Итак, вы наблюдаете состояние сервера и что-то делаете (ProcessServerStatus), когда оно изменяется.

0

По существу, происходит то, что присвоения, которые у вас есть в Main, которые устанавливают ServerStatus в true/false, будут вызывать функцию «set» свойства ServerStatus.

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

В этом случае, основной зарегистрировал событие в линии

Server.ServerStatusChanged += new EventHandler(ProcessServerStatus); 

.

Поскольку вы устанавливаете ServerStatus в значение true, а затем false в Main, запускаются два события, в результате чего ваша консоль отображает «Сервер запущен и работает», а «Сервер выключен, мы работаем над этим». "

2

Вот код, который делает то, что вы хотите.

Обратите внимание на переменную _initialized. Это необходимо, потому что в противном случае ничего не происходит в первый раз. Вам нужно будет установить статус «Истина», прежде чем он начнет работать правильно.

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

class Program 
{ 
    static void Main(string[] args) 
    { 
     Server server = new Server(); 
     server.ServerStatusChanged += new EventHandler(ProcessServerStatus); 
     //server.ServerStatus = true; 
     server.ServerStatus = false; 
     Console.Read(); 
    } 

    public class Server 
    { 
     public event EventHandler ServerStatusChanged; 
     private bool _ServerStatus = false; 
     private bool _initialized = false; 
     public bool ServerStatus 
     { 
      get { return this._ServerStatus; } 
      set 
      { 
       if (this._initialized == true && this._ServerStatus == value) 
        return; // Dont need to do anything;     
       else 
        this._initialized = true; 
       if (this.ServerStatusChanged != null) // make sure the invocation list is not empty      
        ServerStatusChanged(value, new EventArgs()); // Firing Event     
       this._ServerStatus = value; 
      } 
     } 
    } 
    public static void ProcessServerStatus(object sender, EventArgs e) 
    { 
     bool status = (bool)sender; 
     if (status) 
      Console.WriteLine("Server is up and running"); 
     else Console.WriteLine("Server is down, We are working on it it will be back soon"); 
    } 
} 
+0

Не инициализируя значение ServerStatus, я думаю, что вы получаете непредсказуемые результаты, то есть «Сервер работает ...», и, кроме того, поскольку установщик только условно вызывает метод ProcessServerStatus, вы не получаете сообщение «SERver is down ...» – simon

0

Если вы не попадались паттерн наблюдателя прежде, это может быть инстинктивным думать, что все вызовы методов выполняются довольно статично - методы, которые мы называем в нашем коде, что называется. Тем не менее, шаблон наблюдателя позволяет вам делать что-то более динамично. Вы можете что-то сказать во время выполнения «эй, когда такое и что произойдет, дайте мне знать!» Вы можете сообщить мне, вызвав такой-то метод. «Наблюдаемый хранит запись всех, кто сказал ему», когда такие и это случается, дайте мне знать », - а затем, когда это произойдет, он делает именно это - позволяет всем им знать. Это делается путем сохранения списка методов, которые должны быть вызваны, а затем вызова их всех, когда событие «срабатывает».

Линия:

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;, она говорит «сервер запущен и работает»

Смежные вопросы