观察者模式和代表

时间:2009-04-21 23:50:25

标签: c# observer-pattern

我需要帮助尝试理解观察者模式和代理。我在另一个网站上发现了这个代码,我试图了解它实际上在做什么。有人可以帮助我。

当我执行代码时,我收到两条消息“服务器已启动并正在运行”和“服务器已关闭,我们正在努力它将很快恢复”。我想我得到了这两条消息,因为在Main中,有一个server.ServerStatus = true;和server.ServerStatus = false。但是,如果我注释掉server.ServerStatus = 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;

        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 个答案:

答案 0 :(得分:2)

这是执行您想要的代码。

注意_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");
    }
}

答案 1 :(得分:0)

这是一个事件注册......

server.ServerStatusChanged += new EventHandler(ProcessServerStatus);

它说“只要有ServerStatusChanged,就调用ProcesServerStatus方法。”因此,当您将ServerStatus设置为true时,您将调用ProcessServerStatus传递true并打印“Server is up ...”;当你将它更改为false时,会触发另一个事件,但这次ServerStatus为false,因此你得到“Server is down ...”所以,你正在观察服务器状态并在它发生变化时做一些事情(ProcessServerStatus)。 p>

答案 2 :(得分:0)

基本上发生的是您在Main中将ServerStatus设置为true / false的赋值将调用ServerStatus属性的“set”函数。

在该函数中,将创建一个事件并将其触发到ServerStatusChanged处理程序,该处理程序将由注册事件的任何人接收。另请注意,仅在状态更改时才会触发事件。

在这种情况下,Main在

中注册了该事件
Server.ServerStatusChanged += new EventHandler(ProcessServerStatus);

线。

由于您将ServerStatus设置为true,然后在Main中设置为false,因此会触发两个事件,导致控制台同时显示“Server is up and running”和“Server is down,我们正在处理它......”

答案 3 :(得分:0)

如果您之前没有遇到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;行,则表示“服务器已启动并正在运行”