2009-04-21 4 views
1

オブザーバーパターンとデリゲートを理解するのに役立つ必要があります。私はこのコードを別のウェブサイトで見つけたので、実際に何をしているのか理解しようとしています。誰かが私を助けることができますか?オブザーバーパターンとデリゲート

コードを実行すると、「サーバーが稼動しています」と「サーバーがダウンしています。すぐに作業しています」というメッセージが表示されます。私は、Mainにはserver.ServerStatus = trueがあるので、私は両方のメッセージを受け取っていると思います。 server.ServerStatus = falseです。しかし、server.ServerStatus = trueをコメントアウトすると、それから私は "サーバーは稼働しています"というメッセージが表示されますが、 "サーバーがダウンしています。すぐに作業を進めています。"誰か説明できますか?それは言う

server.ServerStatusChanged += new EventHandler(ProcessServerStatus); 

スーザン

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

実際、get {} set {}はJavasではなくC#の機能です。変更されたタグ。 – Esko

答えて

0

これは、イベント登録です... "ServerStatusChangedがあるたびに、ProcesServerStatusメソッドを呼び出します。"したがって、ServerStatusをtrueに設定すると、ProcessServerStatusの呼び出しがtrueになり、「Server is up ...」というメッセージが表示されます。 falseに変更すると、別のイベントが発生しますが、今回はServerStatusがfalseであるため、「Server is down ...」と表示されます。サーバーの状態を監視していて、何か変更(ProcessServerStatus)しています。

0

本質的には、ServerStatusをtrue/falseに設定しているMainの割り当てが、ServerStatusプロパティの「set」機能を呼び出すことです。

この関数内でイベントが作成され、ServerStatusChangedハンドラに送信されます。このハンドラはイベントを登録したすべてのユーザーが受信します。また、イベントが発生するのは、ステータスが変更された場合のみです。この場合

、主

Server.ServerStatusChanged += new EventHandler(ProcessServerStatus); 

ラインでのイベントのために登録されました。

MainでServerStatusをfalseに設定すると、2つのイベントが発生し、コンソールに「Server is up and running」と「Server is down」と表示されます。 "

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"); 
    } 
} 
+0

ServerStatusの値を初期化せずに、 "Server is running ..."という予期せぬ結果を得ていると思います。さらに、SetterがProcessServerStatusメソッドを条件付きで呼び出しているだけなので、 "SErver is down ..." – simon

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;行をコメントアウトすると、 "サーバが起動して実行中"と表示されます

関連する問題