Главная страница
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.019 c
15-1188078391
Германн
2007-08-26 01:46
2007.09.30
Ещё раз про перевод из Си на Паскаль


8-1166741330
GColor
2006-12-22 01:48
2007.09.30
Как создать аналог "Ассоль-Дизайн" или Akvis Decorator???


2-1188801043
Че
2007-09-03 10:30
2007.09.30
Не выполняется команда...


15-1188749345
JaK[Light]
2007-09-02 20:09
2007.09.30
Wanted! Книги....


2-1189095327
user1024
2007-09-06 20:15
2007.09.30
Как узнать папку из которой запущена программа?