Главная страница
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.027 c
3-1180006046
Dmitry_177
2007-05-24 15:27
2007.09.30
Как можно узнать запароленная ли таблица?


15-1188541103
Шмелъ
2007-08-31 10:18
2007.09.30
Mail Observer Application


15-1188343540
Bad_B
2007-08-29 03:25
2007.09.30
Хранилище для информации


15-1188555526
начинающий
2007-08-31 14:18
2007.09.30
Как узнают мои запросы к google? И как с этим боротся?


1-1185132215
atruhin
2007-07-22 23:23
2007.09.30
Создать дубликат компонента в рантайм