Публикация шаблона подписчика в c # Требуется консультация - PullRequest
0 голосов
/ 17 мая 2011

Мне нужно создать что-то для демонстрации, и мне было интересно, могу ли я использовать шаблон pub-sub для реализации Console.Write и Console.ReadLine Я хочу напечатать набор вопросов и ответов. И не могу найти способ реализовать ответ.

Куда бы вы поместили 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]);
        }
    }
}

Есть предложения? спасибо за ваше время

Ответы [ 2 ]

1 голос
/ 18 мая 2011
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]);
        }
    }
}

Не лучший подход, может быть.Но это работает для меня.Приносим извинения за отсутствие описания1008 *

Редактировать

Абонент без событий:

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

Не используя события, но производные классы ... http://protocolbus.casessite.org

Остерегайтесь переменных среды (использует косую черту вместо окон)

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