2015-03-09 1 views
-2

У меня есть проект, в котором его деятельность и функции следуют за последовательным процессом, большую часть времени. Но иногда вам нужно «вернуться» к своим шагам и повторить предыдущие функции.Есть ли альтернатива шаблону Посредника с Collegue «без дела»?

Я сделал диаграмму состояния, чтобы увидеть, насколько это было бы сложно.

Первым подходом, который, как я думал, является применение государственного образца, но количество государств не представляется возможным. Затем «я разделил» и классифицировал его в 6 процессах. А классы черта каждого процесс, что я представлял себе что-то вроде этого:

TProcessXXX = class(TProcess) 
private 
{* atributos privados, etc.. *} 
public 
{* funciones y actividades *} 
procedure DoActivity1; 
procedure DoActivity2; 
{* ... *} 
function DoActivityN: TResultProcess; 
end; 

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

Дизайн, который я видел, является шаблоном посредника и имеет класс, который инкапсулирует диаграмму состояний и «разрешает» каждому процессу. Для координации между собой я рассмотрел возможность добавления методов для общения с классом координатора/посредника. В том числе:

function TProcess.RequestPermission: boolean; 

procedure TProcess.NotifyFinishOperation(Result: TResultOperation); 

В процессе я разработал их с некоторой независимостью.

Что касается того, что вы не просите разрешения на каждое действие, а для некоторых требуется некоторое избыточное упорядочение и снова и снова спрашивать, я применил «блокировку», которая позволяет их включить.

TProcessXXX.PrepareToWork; 
var req: boolean; 
begin 
    req: = RequestPermission; 
    then begin if req 
EnableActivitys 
Work; 
end; 
end; 

Пока все хорошо. Мои сомнения начинались, когда из слоя Presentation вызывают операции. Чтобы получить разрешение, чтобы вызвать у меня есть окольный от слоя Презентации к посреднику: Презентация -> TProcessXXX -> Посредник А потом мы получили разрешения другого по каждому виду деятельности: Представление -> TProcessXXX -> TDataStructure

Когда процесс получает разрешение, захватывает для себя, используя TDataStructure. Он берет на себя, пока операция не будет завершена. Между тем, другие процессы «простаивают». И с уровня презентации может возникнуть необходимость в ненужном запросе.

Я считал отключить элементы управления, что является самым простым и легким. Но тогда нужно будет постоянно включать и отключать.

Я спрашиваю: какие альтернативы вы рекомендуете? Есть ли образец для работы над темой «бездействующих процессов»?


EDIT:

Я изучал альтернативы, такие как стратегии и Visitor, но я не уверен, если они являются лучшим вариантом. И я признаю, что, возможно, эти 3 шаблона (Посредник, Стратегия, Посетитель) не доминируют на 100%. Я забыл прояснить это. Мои извинения.

Я также хотел бы добавить, что если я заслуживаю отрицательного голоса, по крайней мере, будьте любезны, чтобы опубликовать комментарий, объясняющий почему.


EDIT 2:

В соответствии с рекомендациями, я прикрепил ссылку на картину диаграммы состояний: enter image description here

В диаграмме вы можете увидеть, что есть Choise. Предназначен для того, чтобы при запуске оценивалось, какое из последних состояний достигнуто, и продолжить с этого момента.

На этой диаграмме у меня есть отдельные действия в пяти процессах: настройка, управление набором, обучение, тестирование и распознавание.

И я добавил еще один шестой именованный инициализатор, который имеет функцию инициализации структуры данных с данными, доступными из базы данных.

Каждый процесс является коллегой для посредника. Посредник реализует эту диаграмму состояния и решает обработать его «разрешение» на работу.

+1

Я не был тем, кто отклонил ваш вопрос, но я верю, что причина для downvote заключается в том, что Stack Owerflow предназначен для решения конкретных проблем с кодированием, когда вы спрашиваете об использовании правильного шаблона проектирования. Я верю, что задать свой вопрос на http://cs.stackexchange.com/ будет больше. – SilverWarior

+0

Я видел другие подобные вопросы, что-то старое, и не было никаких возражений и полученных ответов. Еще один отрицательный голос, и если кто-то ставит добрые намерения. Поскольку я не смотрел, что тролли в SO ходят, играя отрицательное голосование. У кого власть должна контролироваться. – Delphius

+0

Выполнены ли какие-либо из ваших действий (многопоточность)? – SilverWarior

ответ

0

Ваш вопрос не лучше всего сформирован, поэтому я не совсем уверен, чего вы пытаетесь достичь. Но я предполагаю, что вы хотите реализовать более сложный контроль потока кода, который основан на определенных условиях.

Если мое предположение верно, вы должны проверить шаблон дерева решений.

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

В конце каждого шага вы проверяете конкретное условие, а затем решаете, как действовать на основе этого условия (либо продолжите с следующего шага, либо повторите текущий шаг, либо даже перейдите на совершенно другой шаг).

Из вашей информации о профиле SO я вижу, что вы являетесь студентом по компьютерной инженерии, поэтому я могу сказать вам, что использование деревьев решений обычно обсуждается во время классов разработки ИИ на большой глубине, потому что самые сложные алгоритмы AI на самом деле зависят от использования шаблона дерева решений поскольку он обеспечивает большую масштабируемость.

Таким образом, вы можете проверить свои школьные книги в разделе, посвященном разработке ИИ.

+0

Если вам нужно добавить что-то к описанию моей проблемы, я могу попросить. Я изучил предмет деревьев, как в кафедре структур данных, так и в экспертных системах для использования ИА. Предоставлено это как образец, который я не знаком. Я должен уточнить, что не преподавал в моем изученном, я учился сам. – Delphius

+0

То, что поможет мне лучше всего понять, что вы хотите реализовать, - это предоставить диаграмму состояния, о которой вы говорили, чтобы увидеть сложность вашего кода. – SilverWarior

+0

Нет проблем. В какой-то момент я разделяю диаграмму состояния. – Delphius

Смежные вопросы