Итак, поехали.
Шаблоны проектирования (паттерн, pattern) — это эффективные способы решения характерных задач проектирования, в частности проектирования компьютерных программ. Паттерн не является законченным образцом проекта, который может быть прямо преобразован в код, скорее это описание или образец для того, как решить задачу, таким образом, чтобы это можно было использовать в различных ситуациях.
http://ru.wikipedia.org/wiki/Шаблоны_проектирования
В принципе вопросов по поводу определения не возникает. Интересно, что подразумевают люди, когда в резюме пишут "Владею шаблонами проектирования"? Имхо как по мне сей факт мало о чем говорит. Ведь можно наизусть зазубрить все 73 шаблона (я столько насчитал) и абсолютно не применять их на практике, либо применять там, где это не нужно (так называемая “избыточная сложность”). А можно и без знания того или иного шаблона своим умом дойти до эффективного решения. Ну да ладно это вопрос таланта, опыта и .т.д. Другой вопрос, что человек, который знаком с сабжем при решении реальной задачи, возможно, вспомнит о том или ином шаблоне и попросту не будет изобретать велосипед (но тут таки опять таки больше вопрос в том уместно ли сей шаблон применять). Так что фразу "Владею шаблонами проектирования" я бы перефразировал в “Знаком с шаблонами проектирования и знаю, в какой ситуации, какой применять”.
Лирическое отступление закончил. Начну пожалуй обзор.
Delegation pattern/Шаблон делегирования
Довольно полезный шаблон позволяющий решить проблему множественного наследования. Суть в том, чтобы передать реализацию того или иного метода связанному объекту.
Реализация 1.
unit DelegationPattern; interface uses SysUtils; type IDelegateInterface = interface ['{37573FCA-5D5B-4340-9D64-5CB61F672BB6}'] procedure Method1; procedure Method2; end; TClassA = class(TInterfacedObject, IDelegateInterface) public procedure Method1; procedure Method2; end; TClassB = class(TInterfacedObject, IDelegateInterface) public procedure Method1; procedure Method2; end; TClassDel = class(TInterfacedObject, IDelegateInterface) private FInterface: IDelegateInterface; public procedure Method1; procedure Method2; procedure ToClassA; procedure ToClassB; end; implementation { TClassA } procedure TClassA.Method1; begin Writeln('TClassA.Method1'); end; procedure TClassA.Method2; begin Writeln('TClassA.Method2'); end; { TClassB } procedure TClassB.Method1; begin Writeln('TClassB.Method1'); end; procedure TClassB.Method2; begin Writeln('TClassB.Method1'); end; { TClassDel } procedure TClassDel.Method1; begin FInterface.Method1; end; procedure TClassDel.Method2; begin FInterface.Method2; end; procedure TClassDel.ToClassA; begin FInterface := TClassA.Create; end; procedure TClassDel.ToClassB; begin FInterface := TClassB.Create; end; end.
В принципе в данном примере все прозрачно, с помощью методов TClassDel.ToClassA и TClassDel.ToClassB меняем ссылку на базовый класс, в котором и содержится необходимая реализация.
Реализация 2
type IImplInterface = interface['{96387A25-C8F4-4275-A553-802F9955CF62}'] procedure P1; procedure P2; end; TImplClass = class procedure P1; procedure P2; end; TMyImplClass = class(TInterfacedObject, IImplInterface) FMyImplClass : TImplClass; property MyImplClass: TImplClass read FMyImplClass implements IImplInterface; procedure IImplInterface.P1 = MyP1; procedure MyP1; procedure MyProc; end; implementation { TImplClass } procedure TImplClass.P1; begin Writeln('TMyImplClass.P1'); end; procedure TImplClass.P2; begin Writeln('TMyImplClass.P2'); end; { TMyImplClass } procedure TMyImplClass.MyP1; begin Writeln('TMyClass.MyP1'); end; procedure TMyImplClass.MyProc; begin Writeln('TMyClass.MyProc'); end;
Также есть класс отвечающий за реализацию. С помощью procedure IImplInterface.P1 = MyP1; можно переопределить метод TImplClass тоесть в моем понимании некий аналог виртуальных методов.
Functional design/Шаблон функционального дизайна
Функциональный дизайн гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы.
Вроде бы это и так понятно. Как говорится нужно отделять “Мух от котлет”. У Мартина в “Быстрая разработка программ: принципы, примеры, практика” на эту тему много чего написано.
Immutable
Идея в использовании неизменяемых объектов. Вполне может быть в некоторых ситуациях полезна. Хотя я не вижу сложности в том, чтобы создать такой объект. Представляю себе это примерно так:
type TImmutable = class private FData: string; public procedure Write; constructor Create(Data: string); protected property Data: string read FData; end; implementation { TImmutable } procedure TImmutable.Write; begin Writeln(FData); end; constructor TImmutable.Create(Data: string); begin FData := Data; end;
Комментариев нет:
Отправить комментарий