在c#中发布订户模式需要建议

在c#中发布订户模式需要建议,c#,design-patterns,C#,Design Patterns,我需要为演示构建一些东西,我想知道是否可以使用pub-sub模式来实现Console.Write和Console.ReadLine 我想打印一组问题和答案,但找不到实现答案的方法 您将把Console.Write()和Console.ReadLine()放在哪里;把它传回去 请看我的noddy示例 namespace PubSubOne { class Program { static void Main() { var p

我需要为演示构建一些东西,我想知道是否可以使用pub-sub模式来实现Console.Write和Console.ReadLine 我想打印一组问题和答案,但找不到实现答案的方法

您将把Console.Write()和Console.ReadLine()放在哪里;把它传回去

请看我的noddy示例

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]);
        }
    }
}
名称空间PubSubOne
{
班级计划
{
静态void Main()
{
var processQuestions=新的processQuestions();
processQuestions.StartQuestions();
Console.Read();
}
}
公开课问题
{
NewsSubscriber=NewsSubscriber();
NewsPublisher=新的NewsPublisher();
公共程序问题()
{
publisher.QuestionChanged+=subscriber.Update;
}
公共无效开始查询()
{
publisher.PublishQuestion(“你最喜欢的报纸是什么?”);
}
}
公共类新闻订户
{
公共无效更新(字符串问题)
{
控制台。写(问题);
}
}
公共类新闻发布者
{
私有只读列表_questions=new List();
公共委托无效NotifyObserversHandler(字符串问题);
公共事件NotifyObserversHandler问题已更改;
公共无效发布问题(字符串问题)
{
_问题.加入(问题);
问题更改(_questions[_questions.Count-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]);
        }
    }
}
使用System.Collections.Generic; 命名空间PubSubOne { 班级计划 { 静态void Main() { var processQuestions=新的processQuestions(); processQuestions.StartQuestions(); Console.ReadLine(); } } 公开课问题 { NewsSubscriber=NewsSubscriber(); NewsPublisher=新的NewsPublisher(); 堆栈_answers=新堆栈(); 公共程序问题() { publisher.QuestionAsked+=订阅者.Asked; subscriber.QuestionResponsed+=(答案)=>\u answers.Push(答案); } 公共无效开始查询() { publisher.PublishQuestion(“你最喜欢的报纸是什么?”); publisher.PublishQuestion(“你的电子邮件是什么?”); publisher.PublishQuestion(“您的电子邮件密码是什么?”); 控制台。WriteLine(“答案:”); foreach(var应答在_应答中) { 控制台。写线(应答); } } } 公共类新闻订户 { 公共代表无效(字符串问题); 公共事件回答问题; 公开提问(字符串问题) { 控制台。写(问题); 如果(问题已回答!=null) { 已回答的问题(Console.ReadLine()); } } } 公共类新闻发布者 { 私有只读列表_questions=new List(); 公共委托无效NotifyObserversHandler(字符串问题); 公共事件NotifyObserversHandler提问; 公共无效发布问题(字符串问题) { _问题.加入(问题); 提问(_questions[_questions.Count-1]); } } }
也许不是最好的办法。但这对我很有效。很抱歉没有描述

离题

我们听说你喜欢观察者,所以我们在你的订户里放了一个观察者,这样你可以在观察的时候观察

编辑

无事件订户:

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]);
    }
}
类程序
{
静态void Main()
{
var processQuestions=新的processQuestions();
processQuestions.StartQuestions();
processQuestions.PrintAnswers();
Console.ReadLine();
}
}
公开课问题
{
新闻订户subscriber1=新新闻订户(“Tim”);
新闻订户subscriber2=新新闻订户(“Bob”);
NewsPublisher=新的NewsPublisher();
公共程序问题()
{
publisher.QuestionAsked+=subscriber1.Asked;
publisher.QuestionAsked+=subscriber2.Asked;
}
公共无效开始查询()
{
publisher.PublishQuestion(“你最喜欢的报纸是什么?”);
publisher.PublishQuestion(“你的电子邮件是什么?”);
publisher.PublishQuestion(“您的电子邮件密码是什么?”);
}
公开答案()
{
var subs=new[]{subscriber1,subscriber2};
foreach(子系统中的var newsSubscriber)
{
Console.WriteLine(newsubscriber.Name+“answers:”);
foreach(newsSubscriber.Answers中的var应答)
{
控制台。写线(应答);
}
}
}
}
公共类新闻订户
{
私有只读字符串\u名称;
公共新闻订阅服务器(字符串名称)
{
_名称=名称;
}
列表_answers=新列表();
公共字符串名
{
获取{return\u name;}
}
公共列表答案{获取{返回_答案;}}
公开提问(字符串问题)
{
控制台。WriteLine(_name+”表示:);
_Add(Console.ReadLine());
}
}
公共类新闻发布者
{
私有只读列表_questions=new List();
公共委托无效NotifyObserversHandler(字符串问题);
公共事件NotifyObserversHandler提问;
公共无效发布问题(字符串问题)
{
_问题.加入(问题);
控制台。写(问题);
提问(_questions[_questions.Count-1]);
}
}

不使用事件,而是使用派生类

注意环境变量(使用正斜杠而不是窗口)