Текущий архив: 2007.07.01;
Скачать: CL | DM;
Вниз
Статья на RSDN. Реализовал написаное, интересно ваше мнение. Найти похожие ветки
← →
Kolan © (2007-05-31 14:11) [0]Здравствуйте, прочел
http://rsdn.ru/article/patterns/patterns.xml
и селал проект по ней. В коментах к статье много сообщений что BroadCast — это плохо и надо организовать подписку.
Вопросы:
1. Как её организовать?
2. Как вообще подход с таким медиатором?
← →
Игорь Шевченко © (2007-05-31 14:15) [1]1. как в статье ?
2. нормальный подход
← →
Kolan © (2007-05-31 14:22) [2]> как в статье ?
Ну спицифика другая, но медиатор — да. Модулей нет.
У меня есть N колег и они общаются через медиатор. Пример:
Пользователь жмет «Начать измерение»
TSystemMediator.GetInstance.SendMessage(TStartFFTMeasurmentCommand.Create);
Сообщение получает другой объектprocedure THeadSingleton.ExecuteCommand(Command: TCustomCommand);
begin
inherited;
if Command is TStartFFTMeasurmentCommand then
StartFFTMeasurment;
В StartFFTMeasurment запускается таймер. и в таймере выполняется2. нормальный подход
Рад слышать. Минус один — значительно больше писать. Во превых команды. Во вторых колеги…
Из плюсов — централизованая передача позволила сделать лог:1 13:40:34:390 {Установить порт. | TSetComNameCommand}.
2 13:40:34:390 {Задать чарт для давления | TSetPressureChartCommand}.
3 13:40:34:390 {Задать чарт для ускорения | TSetAccelerationChartCommand}.
4 13:40:34:390 {Запрос состояния системы | TQuerySystemStateCommand}.
5 13:40:34:390 {Состояние системы изменилось. Состояние: 0. | TSystemStateChangedCommand}.
6 13:40:34:390 {Очистить все графики | TClearAllGraphsCommand}.DoSendPressureMeasurmentResults(FFTResults);
Вот её код:procedure THeadSingleton.DoSendPressureMeasurmentResults(
FFTResults: IFFTMeasurment);
var
Command: TFFTMeasuredCommand;
begin
Command := TPressureMeasuredCommand.Create;
Command.FFFT := FFTResults;
TSystemMediator.GetInstance.SendMessage(Command);
end;
И полученый данные FFFT попадают в объект который их сохраняет.inherited;
if Command is TPressureMeasuredCommand then
begin
Pressure := TFFTMeasuredCommand(Command).FFFT;
end;
← →
Kolan © (2007-05-31 14:24) [3]Упс все перепуталось :(
Ну спицифика другая, но медиатор — да. Модулей нет.
У меня есть N колег и они общаются через медиатор. Пример:
Пользователь жмет «Начать измерение»TSystemMediator.GetInstance.SendMessage(TStartFFTMeasurmentCommand.Create) ;
Сообщение получает другой объектprocedure THeadSingleton.ExecuteCommand(Command: TCustomCommand);
begin
inherited;
if Command is TStartFFTMeasurmentCommand then
StartFFTMeasurment;
В StartFFTMeasurment запускается таймер. и в таймере выполняетсяDoSendPressureMeasurmentResults(FFTResults);
Вот её код:procedure THeadSingleton.DoSendPressureMeasurmentResults(
FFTResults: IFFTMeasurment);
var
Command: TFFTMeasuredCommand;
begin
Command := TPressureMeasuredCommand.Create;
Command.FFFT := FFTResults;
TSystemMediator.GetInstance.SendMessage(Command);
end;
И полученый данные FFFT попадают в объект который их сохраняет.inherited;
if Command is TPressureMeasuredCommand then
begin
Pressure := TFFTMeasuredCommand(Command).FFFT;
end;
2. нормальный подход
Рад слышать. Минус один — значительно больше писать. Во превых команды. Во вторых колеги…
Из плюсов — централизованая передача позволила сделать лог:1 13:40:34:390 {Установить порт. | TSetComNameCommand}.
2 13:40:34:390 {Задать чарт для давления | TSetPressureChartCommand}.
3 13:40:34:390 {Задать чарт для ускорения | TSetAccelerationChartCommand}.
4 13:40:34:390 {Запрос состояния системы | TQuerySystemStateCommand}.
5 13:40:34:390 {Состояние системы изменилось. Состояние: 0. | TSystemStateChangedCommand}.
6 13:40:34:390 {Очистить все графики | TClearAllGraphsCommand}.
← →
Kolan © (2007-05-31 15:31) [4]Я что-то не пойму ответ на вопрос 1.
Сейчас медиатор делает БродКаст:procedure TSystemMediator.SendMessage(Command: TCustomCommand);
var
I: Integer;
begin
if Command <> nil then
begin
try
LogCommand(Command);
for I := 0 to FColleagues.Count — 1 do
TCustomColleague(FColleagues[I]).ExecuteCommand(Command);
finally
if Command.FIsDestroy then
FreeAndNil(Command);
end;
end;
end;
А как организовать подписку? Те что-бы коллеги сами подписывались на нужные команды…
← →
Rouse_ © (2007-05-31 17:39) [5]Если ты внимательно прочитал - то никто не подписывается, модуль просто знает о тех командах которые он может обработать.
← →
Kolan © (2007-05-31 17:59) [6]> Если ты внимательно прочитал
Я знаю что там так. А вот в коментах написано что это плохо и тама лучьше сделать подписку, но несказано как, и я согласен. Вот и вопрос — как организовать подписку?
Страницы: 1 вся ветка
Текущий архив: 2007.07.01;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.021 c