Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Введение в паттерны проектирования

Читайте также:
  1. I. Введение
  2. I. Введение
  3. I. Введение
  4. I. Введение
  5. I. Введение.
  6. II. Введение (зачем и для кого написан данный текст).
  7. Автоматизация ивведение звуков в речь
  8. Алексеев Н.Н. Введение в изучение права. М., 1917.
  9. Введение
  10. Введение

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

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

Имена абстрактных классов оформлены курсивом, чтобы отличать их от кон­кретных. Курсив используется также для обозначения абстрактных операций. На диаграмме может изображаться псевдокод, описывающий реализацию операции; в таком случае код представлен в прямоугольнике с загнутым уголком, соединен­ном пунктирной линией с операцией, которую он реализует.

Подмешанным (mixin class) называется класс, назначение которого - предоста­вить дополнительный интерфейс или функциональность другим классам. Он род­ственен абстрактным классам в том смысле, что не предполагает непосредственного инстанцирования. Для работы с подмешанными классами необходимо множествен­ное наследование.

Наследование класса и наследование интерфейса

Важно понимать различие между классом объекта и его типом. Класс объекта определяет, как объект реализован, то есть внутреннее состояние и реализацию операций объекта. Напротив, тип относится только к интерфейсу


Как решать задачи проектирования

объекта - множеству запросов, на которые объект отвечает. У объекта может быть много типов, и объекты разных классов могут иметь один и тот же тип.

Разумеется, между классом и типом есть тесная связь. Поскольку класс опре­деляет, какие операции может выполнять объект, то заодно он определяет и его тип. Когда мы говорим «объект является экземпляром класса», то подразумеваем, что он поддерживает интерфейс, определяемый этим классом.

В языках вроде C++ и Eiffel классы используются для специфицирования, типа и реализации объекта. В программах на языке Smalltalk типы переменных не объявляются, поэтому компилятор не проверяет, что тип объекта, присваиваемо­го переменной, является подтипом типа переменной. При отправке сообщения необходимо проверять, что класс получателя реализует реакцию на сообщение, но проверка того, что получатель является экземпляром определенного класса, не нужна.

Важно также понимать различие между наследованием класса и наследовани­ем интерфейса (или порождением подтипов). В случае наследования класса реа­лизация объекта определяется в терминах реализации другого объекта. Проще говоря, это механизм разделения кода и представления. Напротив, наследование интерфейса (порождение подтипов) описывает, когда один объект можно исполь­зовать вместо другого.

Две эти концепции легко спутать, поскольку во многих языках явное разли­чие отсутствует. В таких языках, как C++ и Eiffel, под наследованием понимается одновременно наследование интерфейса и реализации. Стандартный способ реа­лизации наследования интерфейса в C++ - это открытое наследование классу, в котором есть исключительно виртуальные функции. Истинное наследование интерфейса можно аппроксимировать в C++ с помощью открытого наследования абстрактному классу. Истинное наследование реализации или класса аппроксими­руется с помощью закрытого наследования. В Smalltalk под наследованием пони­мается только наследование реализации. Переменной можно присвоить экземпля­ры любого класса при условии, что они поддерживают операции, выполняемые над значением этой переменной.

Хотя в большинстве языков программирования различие между наследова­нием интерфейса и реализации не поддерживается, на практике оно существует. Программисты на Smalltalk обычно предпочитают считать, что подклассы - это подтипы (хотя имеются и хорошо известные исключения [Соо92]). Программис­ты на C++ манипулируют объектами через типы, определяемые абстрактными классами.

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


 


Программирование в соответствии с интерфейсом, а не с реализацией

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

Однако не менее важно, что наследование позволяет определять семейства объектов с идентичными интерфейсами (обычно за счет наследования от абстракт­ных классов). Почему? Потому что от этого зависит полиморфизм.

Если пользоваться наследованием осторожно (некоторые сказали бы правиль­но), то все классы, производные от некоторого абстрактного класса, будут обладать его интерфейсом. Отсюда следует, что подкласс добавляет новые или замещает ста­рые операции и не скрывает операций, определенных в родительском классе. Все подклассы могут отвечать на запросы, соответствующие интерфейсу абстрактного класса, поэтому они являются подтипами этого абстрактного класса.

У манипулирования объектами строго через интерфейс абстрактного класса есть два преимущества:

а клиенту не нужно иметь информации о конкретных типах объектов, кото­рыми он пользуется, при условии, что все они имеют ожидаемый клиентом интерфейс;

а клиенту необязательно «знать» о классах, с помощью которых реализованы объекты. Клиенту известно только об абстрактном классе (или классах), опре­деляющих интерфейс.

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

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

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

Механизмы повторного использования

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




Дата добавления: 2015-09-11; просмотров: 86 | Поможем написать вашу работу | Нарушение авторских прав

Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. | Вступительное слово | Глава 1. Введение в паттерны проектирования | Введение в паттерны проектирования | Чтотакое паттерн проектирования | Паттерны проектирования в схеме MVC | Каталог паттернов проектирования | Организация каталога | Введение в паттерны проектирования | Введение в паттерны проектирования |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.009 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав