- •197110, Санкт-Петербург, Чкаловский пр., 15.
- •Глава 1. Введение в паттерны проектирования 15
- •Глава 2. Проектирование редактора документов 39
- •Глава 3. Порождающие паттерны 75
- •Глава 4. Структурные паттерны 109
- •Глава 5. Паттерны поведения 173
- •Глава 6. Заключение 271
- •Предисловие
- •Глава 1. Введение в паттерны проектирования
- •1.1. Что такое паттерн проектирования
- •1.2. Паттерны проектирования в схеме mvc в языке Smalltalk
- •1.3. Описание паттернов проектирования
- •1.4. Каталог паттернов проектирования
- •1.5. Организация каталога
- •1.6. Как решать задачи проектирования с помощью паттернов
- •Поиск подходящих объектов
- •Определение степени детализации объекта
- •Специфицирование интерфейсов объекта
- •Специфицирование реализации объектов
- •Механизмы повторного использования
- •Сравнение структур времени выполнения и времени компиляции
- •Проектирование с учетом будущих изменений
- •1.7. Как выбирать паттерн проектирования
- •1.8. Как пользоваться паттерном проектирования
- •Глава 2. Проектирование редактора документов
- •2.1. Задачи проектирования
- •2.2. Структура документа
- •Рекурсивная композиция
- •Паттерн компоновщик
- •2.3. Форматирование
- •Инкапсуляция алгоритма форматирования
- •Классы Compositor и Composition
- •Стратегия
- •2.4. Оформление пользовательского интерфейса
- •Прозрачное обрамление
- •Моноглиф
- •Паттерн декоратор
- •2.5. Поддержка нескольких стандартов внешнего облика
- •Абстрагирование создания объекта
- •Фабрики и изготовленные классы
- •Паттерн абстрактная фабрика
- •2.6. Поддержка нескольких оконных систем
- •Можно ли воспользоваться абстрактной фабрикой?
- •Инкапсуляция зависимостей от реализации
- •Классы Window и WindowImp
- •Подклассы WindowImp
- •Конфигурирование класса Window с помощью WindowImp
- •Паттерн мост
- •2.7. Операции пользователя
- •Инкапсуляция запроса
- •Класс Command и его подклассы
- •Отмена операций
- •История команд
- •Паттерн команда
- •2.8. Проверка правописания и расстановка переносов
- •Доступ к распределенной информации
- •Инкапсуляция доступа и порядка обхода
- •Класс Iterator и его подклассы
- •Паттерн итератор
- •Обход, и действия выполняемые при обходе
- •Класс Visitor и его подклассы
- •Паттерн посетитель
- •2.9. Резюме
- •Глава 3. Порождающие паттерны
- •Паттерн Abstract Factory
- •Паттерн Builder
- •Паттерн Factory Method
- •Паттерн Prototype
- •Паттерн Singleton
- •Обсуждение порождающих паттернов
- •Глава 4. Структурные паттерны
- •Паттерн Adapter
- •Паттерн Bridge
- •Паттерн Composite
- •Паттерн Decorator
- •Паттерн Facade
- •Паттерн Flyweight
- •Паттерн Proxy
- •Обсуждение структурных паттернов
- •Адаптер и мост
- •Компоновщик, декоратор и заместитель
- •Глава 5. Паттерны поведения
- •Паттерн Chain of Responsibility
- •Паттерн Command
- •Паттерн Interpreter
- •Паттерн Iterator
- •Паттерн Mediator
- •Паттерн Memento
- •Паттерн Observer
- •Паттерн State
- •Паттерн Strategy
- •Паттерн Template Method
- •Паттерн Visitor
- •Обсуждение паттернов поведения Инкапсуляция вариаций
- •Объекты как аргументы
- •Должен ли обмен информацией быть инкапсулированным или распределенным
- •Разделение получателей и отправителей
- •Глава 6. Заключение
- •6.1. Чего ожидать от паттернов проектирования
- •Единый словарь проектирования
- •Помощь при документировании и изучении
- •Дополнение существующих методов
- •Цель реорганизации
- •6.2. Краткая история
- •6.3. Проектировщики паттернов
- •Языки паттернов Александра
- •Паттерны в программном обеспечении
- •6.4. Приглашение
- •6.5. На прощание
- •Приложение а. Глоссарий
- •Приложение в. Объяснение нотации
- •В.1. Диаграмма классов
- •В.2. Диаграмма объектов
- •В.3. Диаграмма взаимодействий
- •Приложение с. Базовые классы
- •Библиография
- •Алфавитный указатель
Erich Gamma │ Ralph Johnson │ Richard Helm │ John Vlissides
Design Patterns
Elements of Reusable
Object-Oriented Software
Addison-Wesley
An imprint of Addison Wesley Longman, Inc.
Reading, Masachusetts • Harlow, England • Menlo Park, California
Berkley, California • Don Mills, Ontario • Sydney
Bonn • Amsterdam • Tokyo • Mexico City
Э. Гамма │ Р. Хелм │ Р. Джонсон │ Дж. Влиссидес
Приемы объектно-
ориентированного
проектирования
____________________________
паттерны проектирования
Санкт-Петербург
Москва • Харьков • Минск
2001
Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес
Приемы объектно-ориентированного проектирования
Паттерны проектирования
Перевел с английского А. Слинкин
Руководитель проекта И. Захаров
Научный редактор Н. Шалаев
Литературный редактор А. Петроградская
Технический редактор С. Прока
Иллюстрации А. Бахарев
Художник Н. Биржаков
Верстка Л. Пискунова
ББК 32.973.2-018
УДК 681.3.068
Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж.
П75 Приемы объектно-ориентированного проектирования. Паттерны проектирования. – СПб: Питер, 2001. – 368 с: ил. (Серия «Библиотека программиста»)
ISBN 5-272-00355-1
В предлагаемой книге описываются простые и изящные решения типичных задач, возникающих в объектно-ориентированном проектировании. Паттерны появились потому, что многие разработчики искали пути повышения гибкости и степени повторного использования своих программ. Найденные решения воплощены в краткой и легко применимой на практике форме. Авторы излагают принципы использования паттернов проектирования и приводят их каталог. Таким образом, книга одновременно решает две задачи. Во-первых, здесь демонстрируется роль паттернов в создании архитектуры сложных систем. Во-вторых, применяя содержащиеся в справочнике паттерны, проектировщик сможет с легкостью разрабатывать собственные приложения.
Издание предназначено как для профессиональных разработчиков, так и для программистов, осваивающих объектно-ориентированное проектирование.
Original English language Edition Copyright © 1995 by Addison Wesley Longman, Inc.
© Перевод на русский язык, А. Слинкин, 2001
©Серия, оформление. Издательский дом «Питер», 2001
Оригинал-макет подготовлен издательством «ДМК Пресс».
Права на издание получены по соглашению с Addison-Wesley Longman.
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственность за возможные ошибки, связанные с использованием книги.
ISBN 5-272-00355-1
ISBN 0-201-63361-2 (англ.)
ЗАО «Питер Бук». 196105, Санкт-Петербург, Благодатная ул., д. 67.
Лицензия ИД № 01940 от 05.06.00.
Налоговая льгота – общероссийский классификатор продукции ОК 005-93, том 2; 953000 – книги и брошюры. Подписано в печать 08.10.00. Формат 70x100 Усл. п. л. 29,67. Тираж 5000 экз. Заказ № 1997.
Отпечатано с готовых диапозитивов в ГПП «Печатный двор» Министерства РФ по делам печати,
телерадиовещания и средств массовых коммуникаций.
197110, Санкт-Петербург, Чкаловский пр., 15.
Посвящается
Кэрин
– Э. Гамма
Сильвии
– Р. Хелм
Фейт
– Р. Джонсон
Дрю Энн и Мэттью Джошуа 24:15b
– Дж. Влиссидес
Отзывы на книгу «Design Patterns: Elements
of Reusable Object-Oriented Software»
Одна из самых хорошо написанных и глубоких книг, которые мне доводилось читать... эта работа доказывает необходимость паттернов самым правильным способом: не рассуждениями, а примерами.
Стэн Липпман, The C++ Report
...Новая книга Гаммы, Хелма, Джонсона и Влиссидеса окажет важное и продолжительное воздействие на науку проектирования программного обеспечения. Поскольку авторы преподносят свой труд как относящийся только к объектно-ориентированным программам, боюсь, что многие разработчики, не занимающиеся объектной проблематикой, могут не обратить на книгу внимания. Это будет большой ошибкой. На самом деле каждый, кто занимается проектированием программ, найдет здесь много интересного для себя. Все проектировщики применяют паттерны, поэтому более глубокое понимание повторно используемых абстракций лишь пойдет нам на пользу.
Том ДеМарко, IEEE Software
Полагаю, что книга чрезвычайно ценна, поскольку описывает богатейший опыт объектно-ориентированного проектирования, изложенный в компактной, удобной для многократного применения форме. Безусловно, я снова и снова буду обращаться к идеям, представленным в издании, а ведь именно в этом и состоит суть повторного использования, не так ли?
Санджив Госсайн, Journal of Object-Oriented Programming
Эта книга, столь давно ожидаемая, полностью оправдала все предшествовавшие ей рекламные посулы. Она подобна справочнику архитектора, в котором приведены проверенные временем, испытанные на практике приемы и методы проектирования. Всего авторы отобрали 23 паттерна. Подарите экземпляр этой книги каждому из своих знакомых программистов, желающему усовершенствоваться в своей профессии.
Ларри О'Брайен, Software Development
Следует признать, что паттерны могут полностью изменить подходы к инженерному проектированию программ, привнеся в эту область изящество по-настоящему элегантного дизайна. Из всех имеющихся книг на эту тему «Паттерны проектирования», безусловно, лучшая. Ее следует читать, изучать и переводить на другие языки. Она раз и навсегда изменит ваш взгляд на программное обеспечение.
Стив Билов, Journal of Object-Oriented Programming
«Паттерны проектирования» – замечательная книга. Потратив на ее чтение сравнительно немного времени, большинство программистов на языке C++ смогут начать применять паттерны в своей работе, что улучшит качество создаваемых ими программ. Эта книга передает в наше распоряжение конкретные инструменты, помогающие более эффективно мыслить и выражать свои идеи. Она может фундаментально изменить ваш взгляд на программирование.
Том Каргилл, The C++ Report
СОДЕРЖАНИЕ
Предисловие 10
Глава 1. Введение в паттерны проектирования 15
1.1. Что такое паттерн проектирования 16
1.2. Паттерны проектирования в схеме MVC в языке Smalltalk 17
1.3. Описание паттернов проектирования 19
1.4. Каталог паттернов проектирования 20
1.5. Организация каталога 22
1.6. Как решать задачи проектирования с помощью паттернов 23
Поиск подходящих объектов 24
Определение степени детализации объекта 24
Специфицирование интерфейсов объекта 24
Специфицирование реализации объектов 25
Механизмы повторного использования 28
Сравнение структур времени выполнения и времени компиляции 31
Проектирование с учетом будущих изменений 32
1.7. Как выбирать паттерн проектирования 35
1.8. Как пользоваться паттерном проектирования 36