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

Вниз

Как называется паттерн?   Найти похожие ветки 

 
О-Сознание   (2013-04-13 19:36) [0]

Есть класс, который должен поддерживать некоторые (может все) функции класса TMyList  + свои.

В 1-м случае просто наследуемся.
Во 2-м работаем с переменной.

Так вот, как называется 2-й вариант?
Адаптер?


type
 TMyClass_1 = class (TMyList)
 end;

 TMyClass_2 = class
 private
   FList: TMyList;
 end;



 
MBo ©   (2013-04-13 19:50) [1]

По первой фраз - декоратор
Остальное я не понял :(


 
О-Сознание   (2013-04-13 20:38) [2]

1-й случай это TMyClass_1.
2-й случай это TMyClass_2.


 
DVM ©   (2013-04-13 20:47) [3]


> О-Сознание   (13.04.13 19:36) 


> Так вот, как называется 2-й вариант?

Декоратор, Обертка, в некоторых случаях Прокси


 
Дмитрий С ©   (2013-04-13 20:54) [4]

2. Агрегирование?


 
DVM ©   (2013-04-13 21:00) [5]

Хотя вообще то именно в таком виде

TMyClass_2 = class
private
  FList: TMyList;
end;

это просто [4] и вообще никакой не паттерн, паттерном был бы такой вариант:

TMyClass_2 = class(TMyList)
private
  FList: TMyList;
 ...
end;


 
clickmaker ©   (2013-04-15 13:46) [6]

> был бы такой вариант:
>
> TMyClass_2 = class(TMyList)
> private
>  FList: TMyList;

наследуемся да еще и оборачиваем?


 
DVM ©   (2013-04-15 15:59) [7]


> clickmaker ©   (15.04.13 13:46) [6]


> наследуемся да еще и оборачиваем?

да, распространенная практика, например при создании фильтров на базе TStream:


////////////////////////////////////////////////////////////////////////////////
// TStreamProxy
////////////////////////////////////////////////////////////////////////////////

 TStreamProxy = class(TStream)
 protected
   FAfterStreamChange: TNotifyEvent;
   FBeforeStreamChange: TNotifyEvent;
   FStream: TStream;
   FOwnsStream: Boolean;
   procedure SetStream(Value: TStream);
 protected
   procedure DoAfterStreamChange; virtual;
   procedure DoBeforeStreamChange; virtual;
   procedure SetSize(const NewSize: Int64); override;
 public
   constructor Create(AStream: TStream; AOwnsStream: Boolean = False);
   destructor Destroy; override;
   function Read(var Buffer; Count: Integer): Longint; override;
   function Write(const Buffer; Count: Integer): Longint; override;
   function Seek(Offset: Longint; Origin: Word): Longint; override;
   function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
   property Stream: TStream read FStream write SetStream;
   property OwnsStream: Boolean read FOwnsStream write FOwnsStream;
   property AfterStreamChange: TNotifyEvent read FAfterStreamChange write FAfterStreamChange;
   property BeforeStreamChange: TNotifyEvent read FBeforeStreamChange write FBeforeStreamChange;
 end;


Теперь на базе этого TStreamProxy можем построить, например, буферизованный стрим или шифрующий/дешифрующий стрим и т.д. и т.п., причем он отснется стримом и его можно прозрачно передавать куда угодно, где стрим принимается.


 
DVM ©   (2013-04-15 16:02) [8]


> clickmaker ©   (15.04.13 13:46) [6]

собственно вот c википедии из статьи про декоратор:

TDecorator = class(TInterfaceComponent)
   private
     FComponent: TInterfaceComponent;
   public
     constructor Create(aComponent: TInterfaceComponent);
 end;



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

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

Наверх




Память: 0.48 MB
Время: 0.007 c
15-1363286070
Bitt
2013-03-14 22:34
2013.09.22
TImage рисование точки


15-1365798603
Юрий
2013-04-13 00:30
2013.09.22
С днем рождения ! 13 апреля 2013 суббота


2-1357514076
Pcrepair
2013-01-07 03:14
2013.09.22
Загрузчик на idHTTP зависает при загрузке страниц


2-1357671425
hansa
2013-01-08 22:57
2013.09.22
Собственник визуальных компонент


15-1365770544
O'ShinW
2013-04-12 16:42
2013.09.22
Oracle. Почему так заводится юзер?