Шрифт:
// Листинг 10.1. Использование класса stack в качестве
// интерфейсного класса
template < class Container > class stack {
//...
public:
typedef Container::value_type value_type;
typedef Container::size_type size_type; protected:
Container с;
public:
bool empty(void) const {return c.empty;}
size_type size(void) const {return c.size;}
value_type& top(void) {return c.back; }
const value_type& top const {return c.back; }
void push(const value_type& x) {c.push.back(x); }
void pop(void) {c.pop.back; }
};
Класс stack объявляется путе м задания типа Container
stack < vector< T > > Stack;
В данном случае типом Container является класс vector, но в качестве класса реализации для интерфейсного класса stack (вместо класса vector) можно использо-ватьлюбой контейнер, который определяет следующие методы:
empty size back push.back pop.back
Класс stack поддерживает се м антически корректный интерфейс, традиционно принятый для стеков.
Существует несколько способов отображения интерфейса. Один из них — круг, рядом с которым (чаще — под ним) записывается имя интерфейсного класса. Этот способ показан на рис. 10.5, а. Для отображения операций класса stack м ожно также использовать си м волическое обозначение класса (с м. рис. 10.5, б). Здесь над и м ене м класса отображается индикатор стереотипа << interface>>, обозначающий, что это — интерфейсный класс. Имя интерфейсного класса может начинаться с буквы «I», и тогда все операции этого класса булут заметнее отличаться от других классов.
Для отображения отношений м ежду класса м и stack и vector м ожно использовать понятие реализации. Реализация — это се м антическое отношение между классами, в котором один из них предлагает «контракт» (интерфейсный класс), а другой ero выполняет (класс реализации). В наше м при м ере класс stack определ я ет контракт, а класс vector его выполняет. Отношение реализации отображается отрезком пунктирной линии между двумя прямоугольниками классов с крупной полой стрелкой, указывающей на интерфейсный класс, т.е. на класс, который определяет контракт (рис. 10.5, в). Это изображение читается так: «Класс stack реализуется классом vector». Отношение между интерфейсным классом и его реализатором (средством реализации) также можно отобразить в виде «леденца на палочке» (рис. 10.5, г). Класс stack может быть реализован не только классом vector, но и классами list или deque .
Рис. 10.5. Способы представления интерфейсного класса
Организация интерактивных объектов
Как видите, классы и интерфейсы можно использовать в качестве строительных блоков (т.е. базовых элементов) при создании более сложных классов и интерфейсов. В распределенной или параллельной системе возможно существование больших исложных структур, сотрудничающих с другими структурами, что создает объединение классов и интерфейсов, работающих вместе над достижением общих целей системы. В языке UML такое поведение называется сотрудничеством. Упомянутые выше строительные блоки могут включать как структурные, так и поведенческие элементы системы. Конкретная задача, которую запрашивает пользователь, может включать множество выполняемых вместе объектов. При этом для выполнения разных задач могут использоваться одни и те же объекты, взаимодействующие в разных случалх с различными элементами. Такая коллекция элементов (с учетом взаимодействия между ними) формирует сотрудничество. Понятие сотрудничества состоит из двух частей: структурной части, в которой акцент делается на характере организации и построении сотрудничающих элементов, и поведенческой, в которой основное внимание уделяется взаимодействию между элементами. (Об этом пойдет речь в слелующем разделе.)
Рис. 10.6. Диаграмма сотрудничества для системы составления расписания
Сотрудничество отображается в виде эллипса (начертанного пунктирной линией), содержащего название вариа н та сотрудничества. Имя сотрудничества должно быть уникальным. Оно представляет собой существительное или короткую фразу, состоящую из существительных, которые входят в словарный состав моделируемой системы. Структурные и поведенческие части сотрудничества отображаются внутри эллипса сотрудничества. Пример структурной части системы составления расписания показан нарис. 10.6. Структурная часть сотрудничества представляет собой сочетание классов и интерфейсов, ко м понентов и узлов. Систе м а, показанная на рис. 10.6, может содержать множество вариантов сотрудничества. Каждый вариант сотрудничества уникален в системе, но его элементы — нет. Элементы одного варианта сотрудничества могут быть использованы в другом варианте за счет иной организации.
Отображение параллельного поведения
При отражении поведенческой характеристики системы акцент ставится на ее динамических аспектах. С этой точки зрения нас интересует, как ведут себя элементы системы при взаимодействии с другими элементами той же системы. Именно во взаимодействии одних элементов с другими и проявляются особенности параллелизма. Диаграммы, используемые в этом разделе, позволяют смоделировать:
• поведение объекта в течение его периода существования;
• поведение объектов, которые совместно работают ради достижения конкретной цели;
• поток управления с акцентом на определенном действии или последовательности действий;
• синхронизацию действий элементов и взаимодействие между ними.
В этом разделе также описаны диаграммы, используемые для моделирования распределенных объектов.
Сотрудничество объектов