Как адаптировать шаблон цепочки ответственности для прохождения состояния - PullRequest
0 голосов
/ 30 апреля 2019

Я ищу дизайн, который удовлетворяет следующим требованиям:

  1. Существует один публично видимый объект, который имеет следующий интерфейс:

    class Whatever
    {
        Whatever& GetIntstance();
    
        void UpdateData1(POD d1); // POD: Plain old datatype
        void UpdateData2(POD d2);
        // ...
        void UpdateDataN(POD dN);
    
        bool Question1();
        bool Question2();
        // ...
        bool QuestionM();
    }
    

Где void UpdateDataX(POD dX) (1 <= X <= N) задает некоторое внутреннее состояние.

Где bool QuestionY() (1 <= Y <= M) задает вопрос "да / нет" и вычисляется из внутреннего состояния.

Какой бы ни был экземпляр, возможно, не знает, как ответить на все Вопросы.В случае, если он не знает, как ответить на вопрос, ему необходимо делегировать ответственность. У разных вопросов могут быть разные делегаты. У делегата может быть делегат. При делегировании вопроса объект должен предоставить делегату доступ для чтения к своему состоянию и состоянию всего, что ему делегировано. Делегату может потребоваться много времени для ответа на вопрос (не спрашивайте почему), поэтому его ответ может быть кэширован.Это означает, что делегат должен быть уведомлен, если состояние, от которого он зависит, изменяется.Это также означает, что делегаты должны быть уведомлены о вызове UpdateDataX.

Предположим, что древовидная структура (структура DAG или любая другая структура) делегатов является фиксированной после ее создания.

1 Ответ

1 голос
/ 30 апреля 2019

Типичным способом решения этой проблемы может быть:

  1. Извлечение изменяемого состояния в отдельный объект модели, который позволяет делегатам присоединять к нему прослушиватели обновления (шаблон наблюдателя)
  2. Когда делегаты конструируются (вероятно, Whatever), каждому из них передается объект модели и все остальные делегаты (или что-либо еще), от которых он зависит (внедрение зависимости конструктора)
  3. Если делегату требуется кеш,тогда он сам реализует / создает этот кеш (принцип единой ответственности).

Поскольку вы работаете в C ++, также важно подчеркнуть, что вы должны использовать RAII.Из-за всех отношений жизненного цикла между объектами вы, вероятно, будете придерживаться модели и делегатов с помощью shared_ptr.

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