2011-05-17 64 views
0

我需要爲演示創建一些東西,而且我想知道是否可以使用pub-sub模式來實現Console.Write和Console.ReadLine 我想打印一組問題和答案,並且找不到實現答案的方法。在c#中發佈訂閱者模式需要建議

你會在哪裏把你的Console.Write()和你的Console.ReadLine();並通過回

見我諾迪例如

namespace PubSubOne 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var processQuestions = new ProcessQuestions(); 
      processQuestions.StartQuestions(); 

      Console.Read(); 
     } 
    } 

    public class ProcessQuestions 
    { 
     NewsSubscriber subscriber = new NewsSubscriber(); 
     NewsPublisher publisher = new NewsPublisher(); 

     public ProcessQuestions() 
     { 

      publisher.QuestionChanged += subscriber.Update; 


     } 
     public void StartQuestions() 
     { 
      publisher.PublishQuestion("what is your favourite Newspaper?"); 

     } 
    } 
    public class NewsSubscriber 
    { 
     public void Update(string question) 
     { 
      Console.Write(question); 
     } 
    } 
    public class NewsPublisher 
    { 
     private readonly List<string> _questions = new List<string>(); 

     public delegate void NotifyObserversHandler(string question); 

     public event NotifyObserversHandler QuestionChanged; 

     public void PublishQuestion(string question) 
     { 
      _questions.Add(question); 

      QuestionChanged(_questions[_questions.Count - 1]); 
     } 
    } 
} 

有什麼建議? 感謝您的時間

回答

1
using System; 
using System.Collections.Generic; 

namespace PubSubOne 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var processQuestions = new ProcessQuestions(); 
      processQuestions.StartQuestions(); 

      Console.ReadLine(); 
     } 
    } 

    public class ProcessQuestions 
    { 
     NewsSubscriber subscriber = new NewsSubscriber(); 
     NewsPublisher publisher = new NewsPublisher(); 

     Stack<string> _answers = new Stack<string>(); 

     public ProcessQuestions() 
     { 
      publisher.QuestionAsked += subscriber.Asked; 
      subscriber.QuestionAnswered += (answer) => _answers.Push(answer); 
     } 


     public void StartQuestions() 
     { 
      publisher.PublishQuestion("what is your favourite Newspaper?"); 
      publisher.PublishQuestion("what is your email?"); 
      publisher.PublishQuestion("what is your email password?"); 

      Console.WriteLine("Answers: "); 

      foreach (var answer in _answers) 
      { 
       Console.WriteLine(answer); 
      } 
     } 
    } 

    public class NewsSubscriber 
    { 
     public delegate void NotifyAnswered(string question); 

     public event NotifyAnswered QuestionAnswered; 

     public void Asked(string question) 
     { 
      Console.Write(question); 

      if (QuestionAnswered != null) 
      { 
       QuestionAnswered(Console.ReadLine()); 
      } 
     } 
    } 

    public class NewsPublisher 
    { 
     private readonly List<string> _questions = new List<string>(); 

     public delegate void NotifyObserversHandler(string question); 

     public event NotifyObserversHandler QuestionAsked; 

     public void PublishQuestion(string question) 
     { 
      _questions.Add(question); 
      QuestionAsked(_questions[_questions.Count - 1]); 
     } 
    } 
} 

也許不是最好的辦法。但它適用於我。對不起,缺乏描述的

Offtopic

喲耶,我們聽說你喜歡觀察,所以我們把觀察者的用戶裏面,所以,當你觀察

你可以觀察編輯

無時間用戶:

class Program 
{ 
    static void Main() 
    { 
     var processQuestions = new ProcessQuestions(); 
     processQuestions.StartQuestions(); 
     processQuestions.PrintAnswers(); 
     Console.ReadLine(); 
    } 
} 

public class ProcessQuestions 
{ 
    NewsSubscriber subscriber1 = new NewsSubscriber("Tim"); 
    NewsSubscriber subscriber2 = new NewsSubscriber("Bob"); 
    NewsPublisher publisher = new NewsPublisher(); 

    public ProcessQuestions() 
    { 
     publisher.QuestionAsked += subscriber1.Asked; 
     publisher.QuestionAsked += subscriber2.Asked; 
    } 

    public void StartQuestions() 
    { 
     publisher.PublishQuestion("what is your favourite Newspaper?"); 
     publisher.PublishQuestion("what is your email?"); 
     publisher.PublishQuestion("what is your email password?"); 
    } 

    public void PrintAnswers() 
    { 
     var subs = new[] {subscriber1, subscriber2}; 

     foreach (var newsSubscriber in subs) 
     { 
      Console.WriteLine(newsSubscriber.Name + " answers:"); 
      foreach (var answer in newsSubscriber.Answers) 
      { 
       Console.WriteLine(answer); 
      } 
     } 
    } 
} 

public class NewsSubscriber 
{ 
    private readonly string _name; 

    public NewsSubscriber(string name) 
    { 
     _name = name; 
    } 

    List<string> _answers = new List<string>(); 

    public string Name 
    { 
     get { return _name; } 
    } 

    public List<string> Answers { get { return _answers; } } 

    public void Asked(string question) 
    { 
     Console.WriteLine(_name + " says: "); 
     _answers.Add(Console.ReadLine()); 
    } 
} 

public class NewsPublisher 
{ 
    private readonly List<string> _questions = new List<string>(); 

    public delegate void NotifyObserversHandler(string question); 

    public event NotifyObserversHandler QuestionAsked; 

    public void PublishQuestion(string question) 
    { 
     _questions.Add(question); 
     Console.Write(question); 
     QuestionAsked(_questions[_questions.Count - 1]); 
    } 
} 
+0

感謝那些對我幫助很大 – user9969 2011-05-18 06:08:51