Э. Гамма, Р. Хелм
Скачать 6.37 Mb.
|
D esign Patterns. Elements of Reusable Object-Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides D esign Patterns. Elements of Reusable Object-Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес 2020 ПАТТЕРНЫ ОБЪЕКТНО- ОРИЕНТИРОВАННОГО ПРОЕКТИРОВАНИЯ ЮБИЛЕЙНОЕ ИЗДАНИЕ ЛЕГЕНДАРНОЙ КНИГИ БАНДЫ ЧЕТЫРЕХ ББК 32.973.2-018-02 УДК 004.43 П75 Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. П75 Паттерны объектно-ориентированного проектирования. — СПб.: Питер, 2020. — 448 с.: ил. — (Серия «Библиотека программиста»). ISBN 978-5-4461-1595-2 Больше 25 лет прошло с момента выхода первого тиража книги Design Patterns. За это время книга из популярной превратилась в культовую. Во всем мире ее рекомендуют прочитать каждому, кто хочет связать жизнь с информационными технологиями и программированием. «Русский» язык, на котором разговаривают айтишники, поменялся, многие англоязычные термины стали привычными, паттерны вошли в нашу жизнь. Перед вами юбилейное издание с обновленным переводом книги, ставшей must-read для каж- дого программиста. «Паттерны объектно-ориентированного проектирования» пришли на смену «Приемам объектно-ориентированного проектирования». Четыре первоклассных разработчика — Банда четырех — представляют вашему вниманию опыт ООП в виде двадцати трех паттернов. Паттерны появились потому, что разработчики искали пути повышения гибкости и степени повторного использования своих программ. Авторы не только дают принципы использования шаблонов проектирования, но и систематизируют информацию. Вы узнаете о роли паттернов в архитектуре сложных систем и сможете быстро и эффективно создавать собственные приложения с учетом всех ограничений, возникающих при разработке больших проектов. Все шаблоны взяты из реальных систем и основаны на реальной практике. Для каждого паттерна приведен код на C++ или Smalltalk, демонстрирующий его возможности. 16+ (В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.) ББК 32.973.2-018-02 УДК 004.43 Права на издание получены по соглашению с Addison-Wesley Longman. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги. Издательство не несет ответственности за доступ- ность материалов, ссылки на которые вы можете найти в этой книге. На момент подготовки книги к изданию все ссылки на интернет-ресурсы были действующими. ISBN 978-0201633610 англ. Original English language Edition © 1995 by Addison Wesley Longman, Inc. ISBN 978-5-4461-1595-2 © Перевод на русский язык ООО Издательство «Питер», 2020 © Издание на русском языке, оформление ООО Издательство «Питер», 2020 © Серия «Библиотека программиста», 2020 КРАТКОЕ СОДЕРЖАНИЕ Предисловие .........................................................................................................................................11 Глава 1. Введение в паттерны проектирования ..................................................................15 Глава 2. Практический пример: проектирование редактора документов ..............56 Глава 3. Порождающие паттерны ............................................................................................ 108 Глава 4. Структурные паттерны ................................................................................................ 169 Глава 5. Паттерны поведения .................................................................................................... 262 Глава 6. Заключение ....................................................................................................................... 402 Приложение A. Глоссарий .......................................................................................................... 413 Приложение Б. Объяснение нотации ................................................................................... 417 Приложение В. Фундаментальные классы ......................................................................... 422 Библиография .................................................................................................................................... 428 Алфавитный указатель .................................................................................................................. 436 ОГЛАВЛЕНИЕ Предисловие ...........................................................................................................11 От издательства .............................................................................................................................13 Глава 1. Введение в паттерны проектирования ..................................................................15 1.1. Что такое паттерн проектирования .............................................................................17 1.2. Паттерны проектирования в схеме MVC в языке Smalltalk ...............................19 1.3. Описание паттернов проектирования .......................................................................22 1.4. Каталог паттернов проектирования ...........................................................................24 1.5. Организация каталога ........................................................................................................27 1.6. Как решать задачи проектирования с помощью паттернов ............................29 Поиск подходящих объектов ...........................................................................................29 Определение степени детализации объекта ...........................................................31 Определение интерфейсов объекта ............................................................................32 Определение реализации объектов ............................................................................34 Наследование класса и наследование интерфейса ..............................................36 Механизмы повторного использования ....................................................................39 Сравнение структур времени выполнения и времени компиляции ............44 Проектирование с учетом будущих изменений ......................................................45 1.7. Как выбирать паттерн проектирования ....................................................................52 1.8. Как пользоваться паттерном проектирования ......................................................54 Глава 2. Практический пример: проектирование редактора документов ..............56 2.1. Задачи проектирования ....................................................................................................56 Оглавление 7 2.2. Структура документа ..........................................................................................................59 Рекурсивная композиция ..................................................................................................60 Глифы ...........................................................................................................................................62 Паттерн Composite (компоновщик) ..............................................................................64 2.3. Форматирование ..................................................................................................................65 Инкапсуляция алгоритма форматирования .............................................................65 Классы Compositor и Composition .................................................................................66 Паттерн Strategy (Стратегия) ............................................................................................68 2.4. Оформление пользовательского интерфейса ........................................................69 Прозрачное окружение ......................................................................................................69 Моноглиф ..................................................................................................................................70 Паттерн Decorator (декоратор) ........................................................................................73 2.5. Поддержка нескольких стандартов оформления .................................................73 Абстрагирование создания объекта ............................................................................74 Фабрики и изготовленные классы .................................................................................75 Паттерн Abstract Factory (абстрактная фабрика) ....................................................78 2.6. Поддержка нескольких оконных систем ...................................................................78 Можно ли воспользоваться абстрактной фабрикой? ..........................................78 Инкапсуляция зависимостей от реализации ............................................................79 Классы Window и WindowImp ..........................................................................................82 Подклассы WindowImp .......................................................................................................83 Настройка класса Window с помощью WindowImp ...............................................84 Паттерн Bridge (мост) ...........................................................................................................86 2.7. Операции пользователя ...................................................................................................86 Инкапсуляция запроса ........................................................................................................87 Класс Command и его подклассы ...................................................................................88 Отмена операций ..................................................................................................................90 История команд .....................................................................................................................90 Паттерн Command (команда) ...........................................................................................92 8 Оглавление 2.8. Проверка правописания и расстановка переносов ............................................92 Доступ к распределенной информации .....................................................................93 Инкапсуляция доступа и порядка обхода ..................................................................94 Класс Iterator и его подклассы .........................................................................................95 Паттерн Iterator (итератор) ................................................................................................98 Обход и действия, выполняемые при обходе ..........................................................99 Инкапсуляция анализа ..................................................................................................... 100 Класс Visitor и его подклассы ........................................................................................ 104 Паттерн Visitor (посетитель) ........................................................................................... 105 2.9. Резюме .................................................................................................................................... 106 Глава 3. Порождающие паттерны ............................................................................................ 108 Паттерн Abstract Factory (абстрактная фабрика) ........................................................ 113 Паттерн Builder (строитель) .................................................................................................. 124 Паттерн Factory Method (фабричный метод) ................................................................ 135 Паттерн Prototype (прототип) .............................................................................................. 146 Паттерн Singleton (одиночка) .............................................................................................. 157 Обсуждение порождающих паттернов ........................................................................... 166 Глава 4. Структурные паттерны ................................................................................................ 169 Паттерн Adapter (адаптер) ..................................................................................................... 171 Паттерн Bridge (мост) ............................................................................................................... 184 Паттерн Composite (компоновщик) .................................................................................. 196 Паттерн Decorator (декоратор) ........................................................................................... 209 Паттерн Facade (фасад) ........................................................................................................... 221 Паттерн Flyweight (приспособленец) ............................................................................... 231 Паттерн Proxy (заместитель) ................................................................................................. 246 Обсуждение структурных паттернов ............................................................................... 258 Адаптер и мост ..................................................................................................................... 259 Компоновщик, декоратор и заместитель ................................................................ 260 Оглавление 9 Глава 5. Паттерны поведения .................................................................................................... 262 Паттерн Chain of Responsibility (цепочка обязанностей) ........................................ 263 Паттерн Command (команда) ............................................................................................... 275 Паттерн Interpreter (интерпретатор) ................................................................................ 287 Паттерн Iterator (итератор) .................................................................................................... 302 Паттерн Mediator (посредник) ............................................................................................. 319 Паттерн Memento (хранитель) ............................................................................................ 330 Паттерн Observer (наблюдатель) ........................................................................................ 339 Паттерн State (состояние) ...................................................................................................... 352 Паттерн Strategy (стратегия) ................................................................................................ 362 Паттерн Template Method (шаблонный метод) ............................................................ 373 Паттерн Visitor (посетитель) .................................................................................................. 379 Обсуждение паттернов поведения ................................................................................... 395 Инкапсуляция вариаций ................................................................................................. 395 Объекты как аргументы ................................................................................................... 397 Должен ли обмен информацией быть инкапсулированным или распределенным? ...................................................................................................... 397 Разделение получателей и отправителей ............................................................... 398 Резюме ..................................................................................................................................... 400 Глава 6. Заключение ....................................................................................................................... 402 6.1. Чего ожидать от паттернов проектирования ...................................................... 403 Единый словарь проектирования .............................................................................. 403 Помощь при документировании и изучении ........................................................ 403 Дополнение существующих методов ........................................................................ 404 Цель рефакторинга ............................................................................................................ 405 6.2. Краткая история ................................................................................................................. 407 6.3. Проектировщики паттернов ........................................................................................ 408 Языки паттернов Александра ....................................................................................... 408 Паттерны в программном обеспечении .................................................................. 410 10 Оглавление 6.4. Приглашение ....................................................................................................................... 411 6.5. На прощание........................................................................................................................ 412 Приложение A. Глоссарий .......................................................................................................... 413 Приложение Б. Объяснение нотации ................................................................................... 417 Б.1. Схема классов ..................................................................................................................... 418 Б.2. Схема объектов .................................................................................................................. 420 Б.3. Схема взаимодействий ................................................................................................... 420 Приложение В. Фундаментальные классы ......................................................................... 422 В.1. List ............................................................................................................................................. 422 В.2. Iterator ..................................................................................................................................... 425 В.3. ListIterator .............................................................................................................................. 425 В.4. Point ......................................................................................................................................... 426 В.5. Rect ........................................................................................................................................... 427 Библиография ...................................................................................................... 428 Алфавитный указатель ........................................................................................436 ПРЕДИСЛОВИЕ Книга не является введением в объектно-ориентированное программиро- вание или проектирование. На эти темы написано много других хороших книг. Предполагается, что вы достаточно хорошо владеете по крайней мере одним объектно-ориентированным языком программирования и имеете какой-то опыт объектно-ориентированного проектирования. Безусловно, у вас не должно возникать необходимости лезть в словарь за разъяснением терминов «тип», «полиморфизм», и вам понятно, чем «наследование интер- фейса» отличается от «наследования реализации». С другой стороны, эта книга и не научный труд, адресованный исключи- тельно узким специалистам. Здесь говорится о паттернах проектирования и описываются простые и элегантные решения типичных задач, возникаю- щих в объектно-ориентированном проектировании. Паттерны проектиро- вания не появились сразу в готовом виде; многие разработчики, искавшие возможности повысить гибкость и степень пригодности к повторному ис- пользованию своих программ, приложили много усилий, чтобы поставлен- ная цель была достигнута. В паттернах проектирования найденные решения воплощены в краткой и легко применимой на практике форме. Для использования паттернов не нужны ни какие-то особенные возмож- ности языка программирования, ни хитроумные приемы, поражающие во- ображение друзей и начальников. Все можно реализовать на стандартных объектно-ориентированных языках, хотя для этого потребуется приложить несколько больше усилий, чем в случае специализированного решения, при- менимого только в одной ситуации. Но эти усилия неизменно окупаются за счет большей гибкости и возможности повторного использования. Когда вы усвоите работу с паттернами проектирования настолько, что после удачного их применения воскликнете «Ага!», а не будете смотреть в сомне- 12 Предисловие нии на получившийся результат, ваш взгляд на объектно-ориентированное проектирование изменится раз и навсегда. Вы сможете строить более гибкие, модульные, повторно используемые и понятные конструкции, а разве не для этого вообще существует объектно-ориентированное проектирование? Несколько слов, чтобы предупредить и одновременно подбодрить вас. Не огорчайтесь, если не все будет понятно после первого прочтения книги. Мы и сами не всё понимали, когда начинали писать ее! Помните, что эта книга не из тех, которые, однажды прочитав, ставят на полку. Надеемся, что вы будете возвращаться к ней снова и снова, черпая идеи и ожидая вдохновения. Книга созревала довольно долго. Она повидала четыре страны, была свиде- телем женитьбы трех ее авторов и рождения двух младенцев. В ее создании так или иначе участвовали многие люди. Особую благодарность мы выра- жаем Брюсу Андерсону (Bruce Anderson), Кенту Беку (Kent Beck) и Андре Вейнанду (Andre Weinand) за поддержку и ценные советы. Также благода- рим всех рецензентов черновых вариантов рукописи: Роджера Билефельда (Roger Bielefeld), Грейди Буча (Grady Booch), Тома Каргилла (Tom Cargill), Маршалла Клайна (Marshall Cline), Ральфа Хайра (Ralph Hyre), Брайана Кернигана (Brian Kernighan), Томаса Лалиберти (Thomas Laliberty), Марка Лоренца (Mark Lorenz), Артура Риля (Arthur Riel), Дуга Шмидта (Doug Schmidt), Кловиса Тондо (Clovis Tondo), Стива Виноски (Steve Vinoski) и Ребекку Вирфс-Брок (Rebecca Wirfs-Brock). Выражаем признательность сотрудникам издательства AddisonWesley за поддержку и терпение: Кейту Хабибу (Kate Habib), Тиффани Мур (Tiffany Moore), Лайзе Раффаэле (Lisa Raffaele), Прадипе Сива (Pradeepa Siva) и Джону Уэйту (John Wait). Осо- бая благодарность Карлу Кесслеру (Carl Kessler), Дэнни Саббаху (Danny Sabbah) и Марку Вегману (Mark Wegman) из исследовательского отдела компании IBM за неослабевающий интерес к этой работе и поддержку. И наконец, не в последнюю очередь мы благодарны всем тем людям, которые высказывали замечания по поводу этой книги по интернету, ободряли нас и убеждали, что такая работа действительно нужна. Вот далеко не полный перечень наших «незнакомых помощников»: Йон Авотинс (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), От издательства 13 Томас Кофлер (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. А теперь также есть веб-страница http://st-www.cs.uiuc. edu/users/patterns/DPBook/DPBook.html, на которой размещается последняя информация и обновления к книге. Эрих Гамма Маунтин Вью, штат Калифорния Ричард Хелм Монреаль, Квебек Ральф Джонсон Урбана, штат Иллинойс Джон Влиссидес Готорн, штат Нью-Йорк Август 1994 ОТ ИЗДАТЕЛЬСТВА С момента издания классической книги «Приемы объектно-ориентирован- ного проектирования. Паттерны проектирования» (Design Patterns: Elements of Reusable Object-Oriented Software) прошло 26 лет. За это время было продано более полумиллиона экземпляров книги на английском и 13 других языках. На этой книге выросло не одно поколение программистов. 14 Предисловие В книге описываются простые и изящные решения типичных задач, воз- никающих в объектно-ориентированном проектировании. Паттерны появились потому, что многие разработчики искали пути по- вышения гибкости и степени повторного использования своих программ. Найденные решения воплощены в краткой и легко применимой на практике форме. «Банда Четырех» объясняет каждый паттерн на простом примере четким и понятным языком. Использование паттернов при разработке программных систем позволяет проектировщику перейти на более высо- кий уровень разработки проекта. Теперь архитектор и программист могут оперировать образными названиями паттернов и общаться на одном языке. Таким образом, книга решает две задачи. Во-первых, знакомит с ролью паттернов в создании архитектуры сложных систем. Во-вторых, позволяет проектировщикам с легкостью разрабатывать соб- ственные приложения, применяя содержащиеся в справочнике паттерны. Что изменилось в издании 2020 года? Актуализирована терминология (например, для «реорганизации» кода уже вполне прижился термин «рефакторинг», для share — «совместное использование» вместо «разделения», а для mixin — «примесь»); обновлен стиль; устранены излишне громоздкие слова (например, «специфицирование» или «инстанцирование». Первое можно вполне адекватно заменить «определением», второе — «созданием экземпляра»); книга наконец-то называется «Паттерны объектно-ориентированного проектирования». В квадратных скобках даются ссылки на источники (см. Библиографию), а цифры в круглых скобках обозначают ссылку на страницу, где описывается тот или иной паттерн. Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter. com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах. |