Шаблон наблюдателя и делегаты - PullRequest
1 голос
/ 22 апреля 2009

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

Когда я выполняю код, я получаю оба сообщения: «Сервер работает и работает» и «Сервер не работает, мы работаем над этим, он скоро вернется». Я думаю, что получаю оба сообщения, потому что в главном есть сервер.ServerStatus = true; и сервер. ServerStatus = false. Тем не менее, если я закомментирую server.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");

    }



}

Ответы [ 4 ]

2 голосов
/ 22 апреля 2009

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

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

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

    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 голосов
/ 22 апреля 2009

Если вы раньше не сталкивались с шаблоном 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;, она скажет "сервер запущен и работает"

0 голосов
/ 22 апреля 2009

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

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

В этом случае Main регистрируется на событие в

Server.ServerStatusChanged += new EventHandler(ProcessServerStatus);

линия.

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

0 голосов
/ 22 апреля 2009

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

server.ServerStatusChanged += new EventHandler(ProcessServerStatus);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...