Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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. нормальный подход
Рад слышать. Минус один — значительно больше писать. Во превых команды. Во вторых колеги&#133
Из плюсов — централизованая передача позволила сделать лог:
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 &#151; 1 do
       TCustomColleague(FColleagues[I]).ExecuteCommand(Command);
   finally
     if Command.FIsDestroy then
       FreeAndNil(Command);
   end;
 end;
end;


А как организовать подписку? Те что-бы коллеги сами подписывались на нужные команды&#133


 
Rouse_ ©   (2007-05-31 17:39) [5]

Если ты внимательно прочитал - то никто не подписывается, модуль просто знает о тех командах которые он может обработать.


 
Kolan ©   (2007-05-31 17:59) [6]

> Если ты внимательно прочитал

Я знаю что там так. А вот в коментах написано что это плохо и тама лучьше сделать подписку, но несказано как, и я согласен. Вот и вопрос &#151; как организовать подписку?



Страницы: 1 вся ветка

Текущий архив: 2007.07.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
3-1175754287
ROOT
2007-04-05 10:24
2007.07.01
Незугружается midas.dll помогите!!!!


15-1180624372
Bogdan1024
2007-05-31 19:12
2007.07.01
Диск на 30 дней


4-1169561885
Raptoridze
2007-01-23 17:18
2007.07.01
нажать меню в чужом приложении


2-1181037181
Изя
2007-06-05 13:53
2007.07.01
чтото вида PageControl


6-1164056733
kilonet
2006-11-21 00:05
2007.07.01
Соединение двух компьютеров через модем