Главная страница
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.008 c
15-1365684591
Demo
2013-04-11 16:49
2013.09.22
О веб разработке


1-1314366462
denkop
2011-08-26 17:47
2013.09.22
Как правильно вызвать метод класса из CallBack функции


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


2-1357650272
Pcrepair
2013-01-08 17:04
2013.09.22
Как правильно из потока менять Переменные в другом потоке?


1-1266331114
sniknik
2010-02-16 17:38
2013.09.22
Печать RTF (RichView ? другое ?)