我想知道以下是否使用了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();
}
}
}
我想我的问题是如果我有一个多对一,而不是一个一对多,它是一个反模式?
答案 0 :(得分:3)
如果您认为它是发布 - 订阅,那么它确实没关系。如果您采用域事件样式,您可以在任何给定的域事件中发布任何内容和任意数量的内容,并且任何内容和任意数量的内容都可以订阅域事件。
许多 - >许多,多个 - >一个,一个&>多个都是有效的。