我需要帮助尝试理解观察者模式和代理。我在另一个网站上发现了这个代码,我试图了解它实际上在做什么。有人可以帮助我。
当我执行代码时,我收到两条消息“服务器已启动并正在运行”和“服务器已关闭,我们正在努力它将很快恢复”。我想我得到了这两条消息,因为在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");
}
}
答案 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;
行,则表示“服务器已启动并正在运行”