Это анти-шаблон наблюдателя? (с вопросом о бонусном состоянии машины) - PullRequest
2 голосов
/ 21 января 2011

Мне интересно, является ли следующее неправильное использование шаблона Observer.Я знаю, что субъект должен быть одним, а слушатель - многими.Однако в моем приложении может оказаться больше предметов, чем слушателей!

Игроки

Форма 1 : не требующие объяснений
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();
        }
    }
}

Я предполагаю, что мой вопрос - это Anti-Pattern, если у меня есть МногиеОдин , а не Один ко многим ?

1 Ответ

3 голосов
/ 21 января 2011

Если вы думаете об этом как о публикации-подписке, то это действительно не имеет значения. Если вы выберете стиль «Событие домена», вы можете иметь любое и любое количество вещей, которые будут публиковать любое данное событие домена, и все и любое количество вещей будут подписываться на события домена.

Многие-> Многие, многие-> один, один-> многие действительны.

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