Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

Как сделать паттерн State не к перечеслению, а к множеству?   Найти похожие ветки 

 
Ш-К   (2007-09-05 18:46) [0]

Вот.


 
celades ©   (2007-09-05 18:59) [1]

Ты сам понимаешь чего хочешь?


 
Ш-К   (2007-09-05 19:11) [2]

Да. Я хочу расширять поведение модели путем добаления класса, соответствующего элементу множества.
Для перечисления - без проблем. Что делаете для множеста?
Если ничего не делаете, а в каждом методе рисуете 10-этажные if-ы и case-ы, отпишите сюда. Буду знать.


 
Ш-К   (2007-09-05 19:16) [3]

Вопрос теоритический.


 
oxffff ©   (2007-09-05 19:49) [4]


> Ш-К   (05.09.07 19:16) [3]
> Вопрос теоритический.


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

Честно говоря, идея паттерна - делегирование реализации + Run time его смена.
Что мешает, модифицировать Паттерн для нужной реализации?


 
Ш-К   (2007-09-05 19:57) [5]

Но если у меня множесто из 8 элементов, сколько клвссов состояний, мне прийдется реализовать? Это при том, что ВСЕ они мне не будут нужны.
Тут нужен более красивый подход. Типа: добавил элемент в множество - добавил класс и все работает. :)


 
oxffff ©   (2007-09-05 20:10) [6]

Можно сделать неограниченное множество.

TStateClass=TClass;

TState=class
protected
ActiveStates:TList;
function GetState(idx:TStateClass):boolean;
procedure SetState(idx:TStateClass;value:boolean);
public
constructor create;
destructor destroy;override;
property State[idx:TStateClass]:boolean read GetState write SetState;
end;

{ TState }

constructor TState.create;
begin
ActiveStates:=TList.Create;
end;

destructor TState.destroy;
begin
ActiveStates.free;
end;

function TState.GetState(idx: TStateClass): boolean;
begin
if ActiveStates.IndexOf(idx)>-1 then result:=true else result:=false;
end;

procedure TState.SetState(idx: TStateClass; value: boolean);
begin
if value and (ActiveStates.IndexOf(idx)<0) then ActiveStates.add(idx)
       else ActiveStates.Remove(idx);
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:TState;
begin
a:=TState.create;

a.State[Tobject]:=false;
a.State[Tobject]:=true;
a.State[TButton]:=true;
a.State[TButton]:=false;

a.free;
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
6-1170247144
Alba
2007-01-31 15:39
2007.09.30
отразить в ProgressBar процесс отправки данных постом (TIdHTTP)


3-1179990389
олег_л
2007-05-24 11:06
2007.09.30
Quick Report


15-1188879768
Че
2007-09-04 08:22
2007.09.30
cmd


2-1188891424
НовичеГГх
2007-09-04 11:37
2007.09.30
Как к приложению прикрутить таймер (Планировщик задачь)


3-1180375837
Zesik
2007-05-28 22:10
2007.09.30
Create table