Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Приемы объектно-ориентированного проектирования...doc
Скачиваний:
24
Добавлен:
14.08.2019
Размер:
5.43 Mб
Скачать

Предисловие

Данная книга не является введением в объектно-ориентированное программирование или проектирование. На эти темы есть много других хороших изданий. Предполагается, что вы достаточно хорошо владеете, по крайней мере, одним объектно-ориентированным языком программирования и имеете какой-то опыт объектно-ориентированного проектирования. Безусловно, у вас не должно возникать необходимости лезть в словарь за разъяснением терминов «тип», «полиморфизм», и вам понятно, чем «наследование интерфейса» отличается от «наследования реализации».

С другой стороны, эта книга и не научный труд, адресованный исключительно узким специалистам. Здесь говорится о паттернах проектирования и описываются простые и элегантные решения типичных задач, возникающих в объектно-ориентированном проектировании. Паттерны проектирования не появились сразу в готовом виде; многие разработчики, искавшие возможности повысить гибкость и степень пригодности к повторному использованию своих программ, приложили много усилий, чтобы поставленная цель была достигнута. В паттернах проектирования найденные решения отлиты в краткую и легко применимую на практике форму.

Для использования паттернов не нужны ни какие-то особенные возможности языка программирования, ни хитроумные приемы, поражающие воображение друзей и начальников. Все можно реализовать на стандартных объектно-ориентированных языках, хотя для этого потребуется приложить несколько больше усилий, чем в случае специализированного решения, применимого только в одной ситуации. Но эти усилия неизменно окупаются за счет большей гибкости и возможности повторного использования.

Когда вы усвоите работу с паттернами проектирования настолько, что после удачного их применения воскликнете «Ага!», а не будете смотреть в сомнении на получившийся результат, ваш взгляд на объектно-ориентированное проектирование изменится раз и навсегда. Вы сможете строить более гибкие, модульные, повторно используемые и понятные конструкции, а разве не для этого вообще существует объектно-ориентированное проектирование?

Несколько слов, чтобы предупредить и одновременно подбодрить вас. Не огорчайтесь, если не все будет понятно после первого прочтения книги. Мы и сами не все понимали, когда начинали писать ее! Помните, что эта книга не из тех, которых, однажды прочитав, ставят на полку. Мы надеемся, что вы будете возвращаться к ней снова и снова, черпая идеи и ожидая вдохновения.

Книга созревала довольно долго. Она повидала четыре страны, была свидетелем женитьбы трех ее авторов и рождения двух младенцев. В ее создании так или иначе участвовали многие люди. Особую благодарность мы выражаем Брюсу Андерсону (Brace Anderson), Кенту Беку (Kent Beck) и Андре Вейнанду (Andre Weinand) за поддержку и ценные советы. Также благодарим всех рецензентов черновых вариантов рукописи: Роджера Билефельда (Roger Bielefeld), Грейди Буча (Grady Booch), Тома Каргилла (Tom Cargill), Маршалла Клайна (Marshall Cline), Ральфа Хайра (Ralph Нуге), Брайана Кернигана (Brian Kernighan), Томаса Лалиберти (Thomas Laliberty), Марка Лоренца (Mark Lorenz), Артура Риля (Arthur Riel), Дуга Шмидта (Doug Schmidt), Кловиса Тондо (Clovis Tondo), Стива Виноски (Steve Vinoski) и Ребекку Вирфс-Брок (Rebecca Wirfs-Brock). Выражаем признательность сотрудникам издательства Addison-Wesley за поддержку и терпение: Кейту Хабибу (Kate Habib), Тиффани Мур (Tiffany Moore), Лайзе Раффаэле (Lisa Raffaele), Прадипу Сива (Pradeepa Siva) и Джону Уэйту (John Wait). Особая благодарность Карлу Кесслеру (Carl Kessler), Дэнни Саббаху (Danny Sabbah) и Марку Вегману (Mark Wegman) из исследовательского отдела компании IBM за неослабевающий интерес к этой работе и поддержку.

И наконец, не в последнюю очередь мы благодарны всем тем людям, которые высказывали замечания по поводу этой книги через Internet, ободряли нас и убеждали, что такая работа действительно нужна. Вот далеко не полный перечень наших «незнакомых помощников»: Ион Авотинс (Jon Avotins), Стив Берчук (Steve Berczuk), Джулиан Бердич (Julian Berdych), Матиас Болен (Matthias Bohlen), Джон Брант (John Brant), Алан Кларк (Allan Clarke), Пол Чизхолм (Paul Chisholm), Йене Колдьюи (Jens Coldewey), Дейв Коллинз (Dave Collins), Джим Коплиен (Jim Coplien), Дон Двиггинс (Don Dwiggins), Габриэль Элиа (Gabriele Elia), Дуг Фельт (Doug Felt), Брайан Фут (Brian Foote), Денис Фортин (Denis Fortin), Уорд Харольд (Ward Harold), Херман Хуэни (Hermann Hueni), Найим Ислам (Nayeem Islam), Бикрамжит Калра (Bikramjit Kalra), Пол Кифер (Paul Keefer), Томас Кофлер (Thomas Kofler), Дуг Леа (Doug Lea), Дэн Лалиберте (Dan LaLiberte), Джеймс Лонг (James Long), Анна-Луиза Луу (Ann Louise Luu), Панди Мадхаван (Pundi Madhavan), Брайан Мэрик (Brian Marick), Роберт Мартин (Robert Martin), Дэйв Мак-Комб (Dave McComb), Карл МакКоннелл (Carl McConnell), Кристин Мингинс (Christine Mingins), Ханспетер Мессенбек (Hanspeter Mossenbock), Эрик Ньютон (Eric Newton), Марианна Озкан (Marianne Ozkan), Роксана Пайетт (Roxsan Payette), Ларри Подмолик (Larry Podmolik), Джордж Радин (George Radin), Сита Рамакришнан (Sita Ramakrishnan), Русс Рамирес (Russ Ramirez), Александр Ран (Alexander Ran), Дирк Риэле (Dirk Riehle), Брайан Розенбург (Bryan Rosenburg), Аамод Сейн (Aamod Sane), Дури Шмидт (Duri Schmidt), Роберт Зайдль (Robert Seidl), Хин Шу (Xin Shu) и Билл Уолкер (Bill Walker).

Мы не считаем, что набор отобранных нами паттернов полон и неизменен, он просто отражает нынешнее состояние наших мыслей о проектировании. Мы приветствуем любые замечания, будь то критика приведенных примеров, ссылки на известные способы использования, которые не упомянуты здесь, или предложения по поводу дополнительных паттернов. Вы можете писать нам на адрес издательства Addison-Wesley или на электронный адрес design-patterns@cs.uiuc.edu.

Исходные тексты всех примеров можно получить, отправив сообщение «send design pattern source» по адресу design-patterns-source@cs.uiuc.edu. А теперь также есть Web-страница http://st-www.cs.uiuc.edu/users/patterns/DPBook/DPBook.html, на которой размещается последняя информация и обновления к книге.

Эрих Гамма Маунтин Вью, штат Калифорния

Ричард Хелм Монреаль, Квебек

Ральф Джонсон Урбана, штат Иллинойс

Джон Влиссидес Готорн, штат Нью-Йорк

Август, 1994

Вступительное слово

Любая хорошо структурированная объектно-ориентированная архитектура изобилует паттернами. На самом деле, для меня одним из критериев качества объектно-ориентированной системы является то, насколько внимательно разработчики отнеслись к типичным взаимодействиям между участвующими в ней объектами. Если таким механизмам на этапе проектирования системы уделялось достаточное внимание, то архитектура получается более компактной, простой и понятной, чем в случае, когда наличие паттернов игнорировалось.

Важность паттернов при создании сложных систем давно осознана в других дисциплинах. Так, Кристофер Александр и его сотрудники, возможно, впервые предложили применять язык паттернов для архитектурного проектирования зданий и городов. Эти идеи, развитые затем другими исследователями, ныне глубоко укоренились в объектно-ориентированном проектировании. В двух словах концепция паттерна проектирования в программировании – это ключ к использованию разработчиками опыта высококвалифицированных коллег.

В данной работе излагаются принципы применения паттернов проектирования и приводится каталог таких паттернов. Тем самым книга решает сразу две задачи. Во-первых, она демонстрирует роль паттернов в проектировании архитектуры сложных систем. Во-вторых, содержит практичный справочник удачных паттернов, которые разработчик может применить в собственных приложениях.

Мне выпала честь работать вместе с некоторыми авторами книги над проблемами архитектурного дизайна. Я многому научился у этих людей и полагаю, что то же самое можно будет сказать и о вас, после того как вы прочтете эту книгу.

Грейди Буч,

Главный научный сотрудник

Rational Software Corporation

Советы читателю

Книга состоит из двух частей. В главах 1 и 2 рассказывается, что такое паттерны проектирования и как с их помощью, можно разрабатывать объектно-ориентированные программы. Практическое применение паттернов проектирования демонстрируется на примерах. Главы 3, 4 и 5 – это каталог паттернов проектирования.

Каталог занимает большую часть книги. Три главы отражают деление паттернов на категории: порождающие паттерны, структурные паттерны и паттерны поведения. Каталогом можно пользоваться по-разному: читать его с начала и до конца или переходить от одного паттерна к другому. Удачен и другой путь: тщательно изучить любую главу, чтобы понять, чем отличаются тесно связанные между собой паттерны.

Ссылки между паттернами дают возможность сориентироваться в каталоге. Это также позволит уяснить, как различные паттерны связаны друг с другом, как их можно сочетать между собой и какие паттерны могут хорошо работать совместно. На рис. 1.1 связи между паттернами изображены графически.

Можно читать каталог, ориентируясь на конкретную задачу. В разделе 1.6 вы найдете описание некоторых типичных задач, возникающих при проектировании повторно используемых объектно-ориентированных программ. После этого переходите к изучению паттернов, предназначенных для решения интересующей вас задачи. Некоторые предпочитают сначала ознакомиться со всем каталогом, а потом применить те или иные паттерны.

Если ваш опыт объектно-ориентированного проектирования невелик, начните изучать самые простые и распространенные паттерны:

  • абстрактная фабрика;

  • адаптер;

  • компоновщик;

  • декоратор;

  • фабричный метод;

  • наблюдатель;

  • стратегия;

  • шаблонный метод.

Трудно найти объектно-ориентированную систему, в которой не используются хотя бы некоторые из указанных паттернов, а уж в больших системах встречаются чуть ли не все. Разобравшись с этим подмножеством, вы получите представление как о некоторых определенных паттернах, так и об объектно-ориентированном проектировании в целом.

Принятые в книге обозначения

Для облегчения работы с книгой издательством «ДМК Пресс» приняты следующие соглашения:

  • коды программ, важные операторы, классы, объекты, методы и свойства обозначены в книге специальным шрифтом (Courier), что позволяет легко найти их в тексте;

  • смысловые акценты, определения, термины, встретившиеся впервые, обозначены курсивом;

  • команды, пункты меню, кнопки, клавиши, функции выделены полужирным шрифтом.