这是观察者反模式吗? (有奖状态机问题)

时间:2011-01-21 16:45:12

标签: c# events design-patterns observer-pattern anti-patterns

我想知道以下是否使用了Observer模式。我知道主题应该是众多的听众。但是,我的应用程序中的主题可能比听众更多!

球员

Form1 :自我解释
DocumentCreator :包含工厂方法和从列表中选择文件的策略
文档:包含有关文档文件和儿童模板方法的信息

IErrorProne :上述玩家实施活动的界面,将其转化为主题 报告:侦听IErrorProne对象并处理日志记录/电子邮件 DocumentState :这是一个奖励,我有点不确定。我还没有完全确定模板之外的良好流程。目前我在Document类中有一个状态机。我想将状态机拉出Document类并进入Form1,将两者相互分离。

public interface IErrorProne
{
    public delegate void ErrorEventDelegate(
        object sender, 
        ErrorEventArgs e
        );

    public event ErrorEventDelegate ReportError;
}

public abstract class Document : IDisposable, IErrorProne // My Template
{
    public void Process()
    {
        //Error Occured
        OnReportError(); // safely triggers error reporting
    }
}

public class Reporting
{
    static Reporting instance = new Reporting();

    public void HandleError(object sender, ErrorEventArgs e);
}

public partial class Form1 
{
    private DocumentCreator docFactory 
                                = new DocumentCreator(new RandomPicking());
    private Document theDoc     = null;
    private Reporting reporting = Reporting.Instance;
    private DocState state      = new InitialState(); 
    //DocState not in this example but demonstrates how it might work

    public Form1()
    {
        docFactory.ReportError += reporting.HandleError;
        theDoc.ReportError     += reporting.HandleError;

        docFactory.ReportError += state.HandleError;
        theDoc.ReportError     += state.HandleError;
    }

    void BackgroundWork(...)
    {
        using (theDoc = DocumentFactory.Instance.CreateDocument())
        {
           if (theDoc != null)
               theDoc.Process();
        }
    }
}

我想我的问题是如果我有一个多对一,而不是一个一对多,它是一个反模式?

1 个答案:

答案 0 :(得分:3)

如果您认为它是发布 - 订阅,那么它确实没关系。如果您采用域事件样式,您可以在任何给定的域事件中发布任何内容和任意数量的内容,并且任何内容和任意数量的内容都可以订阅域事件。

许多 - >许多,多个 - >一个,一个&>多个都是有效的。