Тема 4 . Структурни диаграми по uml 2.0

48
Тема Тема 4 4 . . Структурни Структурни диаграми по UML 2.0 диаграми по UML 2.0

Upload: agrata

Post on 13-Jan-2016

54 views

Category:

Documents


5 download

DESCRIPTION

Тема 4 . Структурни диаграми по UML 2.0. Структурни диаграми. Зависимости; Имплементиране на зависимости; Агрегация и композиция ; Съвместно използване на моделите ; Имплементиране на композицията ; Имплементиране на агрегация ; Интерфейси ; Имплементиране на интерфейси; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Тема  4 .  Структурни диаграми по UML 2.0

Тема Тема 44. . Структурни Структурни диаграми по UML 2.0диаграми по UML 2.0

Page 2: Тема  4 .  Структурни диаграми по UML 2.0

Структурни диаграмиСтруктурни диаграми

Зависимости;Зависимости; Имплементиране на зависимости;Имплементиране на зависимости; Агрегация и композицияАгрегация и композиция;; Съвместно използване на моделитеСъвместно използване на моделите;; Имплементиране на композициятаИмплементиране на композицията;; Имплементиране на агрегацияИмплементиране на агрегация;; ИнтерфейсиИнтерфейси;; Имплементиране на интерфейси;Имплементиране на интерфейси; Предефиниран интерфейс IПредефиниран интерфейс Ippersistentersistent;; Имплементиране на интерфейсите.Имплементиране на интерфейсите.

Page 3: Тема  4 .  Структурни диаграми по UML 2.0

ЗависимостиЗависимости

Същност:Същност:

Зависимост между елементи на Зависимост между елементи на ООП съществува ако промяната на ООП съществува ако промяната на дефиницията на единия елемент дефиницията на единия елемент води до промяна на свързания води до промяна на свързания (зависим) елемент.(зависим) елемент.

Page 4: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на Имплементиране на зависимостизависимости

Имплементиране:Имплементиране:Не е необходимо да се имплементират по Не е необходимо да се имплементират по специален начин зависимостите. Те се отразяват специален начин зависимостите. Те се отразяват на кода, който се създава към конкретния клас. на кода, който се създава към конкретния клас. Например, в кода на студента зависимост има Например, в кода на студента зависимост има при класа при класа CPerson CPerson в който има валидизиращ клас, в който има валидизиращ клас, служещ за проверка на ЕГН. Тази зависимост в служещ за проверка на ЕГН. Тази зависимост в класа не е нужно да се създава чрез собствен класа не е нужно да се създава чрез собствен клас. Това може да се отрази в методите на клас. Това може да се отрази в методите на класа, като се създаде валидизиращ метод-класа, като се създаде валидизиращ метод-логическа проверка за валидност на низа (ЕГН). логическа проверка за валидност на низа (ЕГН). Методът се вгражда в класа. Той може да е Методът се вгражда в класа. Той може да е статичен метод на класа, връщащ логически статичен метод на класа, връщащ логически резултат. Ако ЕГН е валиден – true, иначе false.резултат. Ако ЕГН е валиден – true, иначе false.

Page 5: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на Имплементиране на зависимостизависимостиabstract class CPerson {abstract class CPerson {

private class Sex {private class Sex {static final int Male=0;static final int Male=0;static final int Female=1;static final int Female=1;

}}private String m_strName;private String m_strName;private int m_Sex;private int m_Sex;private String m_egn;private String m_egn;private CAddress m_address;private CAddress m_address;public CPerson(String Name, String egn) public CPerson(String Name, String egn) throws Exceptionthrows Exception { {

m_strName=Name;m_strName=Name;intint iSex=Integer.valueOf(egn.substring(8,9).toString());iSex=Integer.valueOf(egn.substring(8,9).toString());if((iSex%2)!=0){if((iSex%2)!=0){

m_Sex=Sex.Female;m_Sex=Sex.Female;}}else{else{

m_Sex=Sex.Male;m_Sex=Sex.Male;}}if(if(ValidateEGN(egn)ValidateEGN(egn)) m_egn=egn;) m_egn=egn;else throw new Exception("Invalid EGN...");else throw new Exception("Invalid EGN...");

}}// зависимости// зависимости

public static boolean ValidateEGN(String strEGN) { public static boolean ValidateEGN(String strEGN) { // анализиране на параметъра и определяне на валидността по алгоритъм // анализиране на параметъра и определяне на валидността по алгоритъм

за за // проверка// проверка

return true;return true;}}

}}

Page 6: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на Имплементиране на зависимостизависимостиПримерна реализация на метода за проверка на ЕГН:Примерна реализация на метода за проверка на ЕГН:

abstract class CPerson {abstract class CPerson {///............///............// зависимости// зависимости public static boolean ValidateEGN(String strEGN)public static boolean ValidateEGN(String strEGN) {{ if(strEGN.length()!=10)if(strEGN.length()!=10) return false;return false; int iyear=Integer.valueOf(strEGN.substring(0,2));int iyear=Integer.valueOf(strEGN.substring(0,2)); int imonth=Integer.valueOf(strEGN.substring(2,4));int imonth=Integer.valueOf(strEGN.substring(2,4)); int iday=Integer.valueOf(strEGN.substring(4,6));int iday=Integer.valueOf(strEGN.substring(4,6));// // ToDo…ToDo… Validate iyear, imonth, iday values by Date class check Validate iyear, imonth, iday values by Date class check if(imonth>12){if(imonth>12){ imonth-=40;imonth-=40; if(imonth<0)if(imonth<0) imonth+=20;imonth+=20; }} if(imonth<1||imonth>12)if(imonth<1||imonth>12) return false;return false;

Page 7: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на Имплементиране на зависимостизависимости

int iSex=Integer.valueOf(strEGN.substring(8,9));int iSex=Integer.valueOf(strEGN.substring(8,9)); if((iSex%2)!=0 && m_Sex==Sex.Male) return false;if((iSex%2)!=0 && m_Sex==Sex.Male) return false; else{ if((iSex%2)==0 && m_Sex==Sex.Female) return false;}else{ if((iSex%2)==0 && m_Sex==Sex.Female) return false;} int icheck=(Integer.parseInt(strEGN.substring(0,1))*2);int icheck=(Integer.parseInt(strEGN.substring(0,1))*2); icheck+=Integer.valueOf(strEGN.substring(1,2))*4;icheck+=Integer.valueOf(strEGN.substring(1,2))*4; icheck+=Integer.valueOf(strEGN.substring(2,3))*8;icheck+=Integer.valueOf(strEGN.substring(2,3))*8; icheck+=Integer.valueOf(strEGN.substring(3,4))*5;icheck+=Integer.valueOf(strEGN.substring(3,4))*5; icheck+=Integer.valueOf(strEGN.substring(4,5))*10;icheck+=Integer.valueOf(strEGN.substring(4,5))*10; icheck+=Integer.valueOf(strEGN.substring(5,6))*9;icheck+=Integer.valueOf(strEGN.substring(5,6))*9; icheck+=Integer.valueOf(strEGN.substring(6,7))*7;icheck+=Integer.valueOf(strEGN.substring(6,7))*7; icheck+=Integer.valueOf(strEGN.substring(7,8))*3;icheck+=Integer.valueOf(strEGN.substring(7,8))*3; icheck+=Integer.valueOf(strEGN.substring(8,9))*6;icheck+=Integer.valueOf(strEGN.substring(8,9))*6; icheck=icheck%11;icheck=icheck%11; if(icheck==10)if(icheck==10) icheck=0;icheck=0; int iTest=Integer.valueOf(strEGN.substring(9,10));int iTest=Integer.valueOf(strEGN.substring(9,10)); if(icheck!=iTest)if(icheck!=iTest) return false;return false; return true;return true; }}}}

Page 8: Тема  4 .  Структурни диаграми по UML 2.0

Агрегация и композицияАгрегация и композиция

Дефиниции: Дефиниции: Агрегация е асоциации от типа “е част Агрегация е асоциации от типа “е част

от”. Обектът от “част” може да остане да от”. Обектът от “част” може да остане да съществува и без обекта “цяло”.съществува и без обекта “цяло”.

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

Page 9: Тема  4 .  Структурни диаграми по UML 2.0

Агрегация и композицияАгрегация и композиция Примери:Примери:Самолетът Самолетът е съставен оте съставен от двигател(и), ... Двигателят двигател(и), ... Двигателят е част е част

отот самолета. самолета. (композиция) 1 1..*(композиция) 1 1..*

Пратката Пратката се състоисе състои от пакети. Пакетът от пакети. Пакетът е част от е част от пратката.пратката.(агрегация) 1 1..*(агрегация) 1 1..*

Групата Групата се състоисе състои от студенти. Студентът от студенти. Студентът е част от е част от групата групата си.си.

(агрегация) 0..* 1..*(агрегация) 0..* 1..*

Групата Групата се състоисе състои от групи в ролята на подгрупа. от групи в ролята на подгрупа. Подгрупата Подгрупата е част от е част от групата си.групата си.

Рекурсивно дефиниранеРекурсивно дефиниране0..10..1 0..* 0..*

Page 10: Тема  4 .  Структурни диаграми по UML 2.0

Агрегация и композицияАгрегация и композициядиаграмидиаграми

Page 11: Тема  4 .  Структурни диаграми по UML 2.0

Агрегация и композицияАгрегация и композициямултипликаторимултипликатори

Мултипликатори:Мултипликатори:

Пакетът е част от една и само една пратка.Пакетът е част от една и само една пратка. Пратката се образува от един или повече пакетиПратката се образува от един или повече пакети

Двигателят е част от един и само един самолет.Двигателят е част от един и само един самолет. Един самолет има един или повече двигатели.Един самолет има един или повече двигатели.

Един студент може да е член на една или повече групи.Един студент може да е член на една или повече групи. Групата може да се състави от един или повече Групата може да се състави от един или повече

студента.студента.

Всяка група може да е част от по-голяма група.Всяка група може да е част от по-голяма група. Групата може да се изгради от по малки подгрупи.Групата може да се изгради от по малки подгрупи.

Page 12: Тема  4 .  Структурни диаграми по UML 2.0

Моделиране на Моделиране на агрегациятаагрегацията

(състав)(състав)Формална дефиниция: Цялото се съставено от Формална дефиниция: Цялото се съставено от

елементи (части). елементи (части). Елементът (част) е част от Елементът (част) е част от цялото.цялото.

UML диаграмите за моделиране на агрегацията са UML диаграмите за моделиране на агрегацията са самостоятелни, въпреки близостта им с самостоятелни, въпреки близостта им с асоциацията. Това е така поради широкото асоциацията. Това е така поради широкото разпространение на този вид отношение в разпространение на този вид отношение в практиката. Символизира се с ромб, насочен към практиката. Символизира се с ромб, насочен към класа цяло. Поради това, че е вид асоциация, тя се класа цяло. Поради това, че е вид асоциация, тя се маркира по подобен начин като асоциацията-с маркира по подобен начин като асоциацията-с етикет, мултипликатор и роли. Допуска се липса етикет, мултипликатор и роли. Допуска се липса на мултипликатор от страната на цялото, като в на мултипликатор от страната на цялото, като в този случай се подразбира 1този случай се подразбира 1. .

Page 13: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на Имплементиране на агрегациятаагрегацията

(състав) (състав)Най-често агрегацията (състав) се Най-често агрегацията (състав) се

имплементира с инстанция на имплементира с инстанция на променлива от друг клас в класа. променлива от друг клас в класа. Разликата със съвкупността Разликата със съвкупността (композиция) е в принципите на (композиция) е в принципите на унищожаване на класа. При състав унищожаване на класа. При състав класът трябва да се унищожава класът трябва да се унищожава при унищожаване на заграждащия при унищожаване на заграждащия го клас.го клас.

Page 14: Тема  4 .  Структурни диаграми по UML 2.0

Правила за Правила за разграничаване на разграничаване на

агрегациятаагрегацията Трябва да е смислена фразата “тази част е част от Трябва да е смислена фразата “тази част е част от

цялото”;цялото”; ЧасттаЧастта трябва да е част от универсума. Тя трябва да има трябва да е част от универсума. Тя трябва да има

собствени атрибути и методи;собствени атрибути и методи;Примери:Примери:– двигателят е част от самолета;двигателят е част от самолета;– студентът е част от групата си ;студентът е част от групата си ;– длъжността част ли е от служителя? => асоциациядлъжността част ли е от служителя? => асоциация

ЧасттаЧастта трябва да е съществена за цялото към което се трябва да е съществена за цялото към което се отнася. Ако частта е от универсума, но ако не е съществена отнася. Ако частта е от универсума, но ако не е съществена при разглеждане на текущата абстракция, представена при разглеждане на текущата абстракция, представена чрез класа, тя не трябва да се моделира към него.чрез класа, тя не трябва да се моделира към него.

Примери: Самолет – двигател в различни приложения.Примери: Самолет – двигател в различни приложения. Агрегацията е вид асоциацияАгрегацията е вид асоциация и има мултипликатори и и има мултипликатори и

роли. По същия начин, както при асоциациите, при роли. По същия начин, както при асоциациите, при агрегацията има обозначение на тези елементи;агрегацията има обозначение на тези елементи;

Агрегацията се наследяваАгрегацията се наследява.. Както при асоциациите, тя се Както при асоциациите, тя се моделира с комбинация от атрибути и методи на класовете. моделира с комбинация от атрибути и методи на класовете. По същия начин тя се наследява при класова йерархия; По същия начин тя се наследява при класова йерархия;

Page 15: Тема  4 .  Структурни диаграми по UML 2.0

Особености на Особености на композициятакомпозицията

АгрегацияАгрегация (състав) и (състав) и композициякомпозиция (съвкупност) дефинират отношение (съвкупност) дефинират отношение между два класа в класова йерархия, между два класа в класова йерархия, определящо връзка между два класа от определящо връзка между два класа от тип „е част от“ . И двата се тип „е част от“ . И двата се имплементират с инстанция на имплементират с инстанция на променлива от друг клас в класа. променлива от друг клас в класа.

Разлика:Разлика:При При композициякомпозиция (съвкупност) класът не (съвкупност) класът не

се унищожава при унищожаване на се унищожава при унищожаване на заграждащия го клас.заграждащия го клас.

Page 16: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на агрегациятаИмплементиране на агрегацията и композицияи композиция

Използване на йерархиите за изграждане на Използване на йерархиите за изграждане на дефинициите на даден клас:дефинициите на даден клас:

1. Чрез включване на клас във вътрешността на 1. Чрез включване на клас във вътрешността на друг клас:друг клас:

Примери:Примери: диалогов контрол на потребителски интерфейс диалогов контрол на потребителски интерфейс

може да съдържа прости контроли, като може да съдържа прости контроли, като бутони, списъчни контроли, редактиращи бутони, списъчни контроли, редактиращи полета и др. Тези контроли полета и др. Тези контроли са част отса част от диалоговия контрол и се включват в неговия диалоговия контрол и се включват в неговия клас;клас;

страниците, които са част от книга. страниците, които са част от книга.

Page 17: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на агрегациятаИмплементиране на агрегацията и композицияи композиция

2. Чрез преобразуване на съществуващи 2. Чрез преобразуване на съществуващи обобщени класове и тяхното наследяване:обобщени класове и тяхното наследяване:

Например,диалогов клас може да се Например,диалогов клас може да се разглежда като специализиран вариант на разглежда като специализиран вариант на по-общия клас прозорец. по-общия клас прозорец. Специализираният клас може автоматично Специализираният клас може автоматично да използва атрибутите на по-общия клас- да използва атрибутите на по-общия клас- големина, позиция и други и може големина, позиция и други и може евентуално да добави нови атрибути и евентуално да добави нови атрибути и поведение към него, например свързаните поведение към него, например свързаните към него обекти контроли. Такъв вид към него обекти контроли. Такъв вид йерархия е наследяванетойерархия е наследяването..

Page 18: Тема  4 .  Структурни диаграми по UML 2.0

Съвместно използване на Съвместно използване на моделитемоделите

Обща схема, съдържаща класови йерархии, Обща схема, съдържаща класови йерархии, асоциация, агрегация и композиция:асоциация, агрегация и композиция:

Page 19: Тема  4 .  Структурни диаграми по UML 2.0

Съвместно използване на Съвместно използване на моделитемоделите

Видове класови йерархии в схемата:Видове класови йерархии в схемата: Асоциациите по принцип описват отношения Асоциациите по принцип описват отношения

между самостоятелни (независими класове):между самостоятелни (независими класове):

Page 20: Тема  4 .  Структурни диаграми по UML 2.0

Съвместно използване на Съвместно използване на моделитемоделите

Класовете библиотека (Класовете библиотека (LibraryLibrary) и читател () и читател (ReaderReader) са в ) са в асоциацията, която е зависима (се управлява от клас) - асоциацията, която е зависима (се управлява от клас) - Class CClass C . В примера класът, управляващ асоциацията е . В примера класът, управляващ асоциацията е заемане (заемане (BorrowingBorrowing). Могат да се налагат ограничения ). Могат да се налагат ограничения за броя на заетите книги, например 0..4 (до 4 книги)за броя на заетите книги, например 0..4 (до 4 книги) ::

Page 21: Тема  4 .  Структурни диаграми по UML 2.0

Съвместно използване на Съвместно използване на моделитемоделите

Агрегация (Агрегация (AggregationAggregation) и Композиция () и Композиция (compositioncomposition) описват ) описват отношения между несамостоятелни (зависими класове), отношения между несамостоятелни (зависими класове), между които има зависимост от типа част/цяло,определяно с между които има зависимост от типа част/цяло,определяно с думата от естествен език “има”. думата от естествен език “има”.

В примерната схема агрегации са отношенията:В примерната схема агрегации са отношенията: Книга и библиотека;Книга и библиотека; Читател и библиотека;Читател и библиотека; Заемане и библиотека;Заемане и библиотека;

Page 22: Тема  4 .  Структурни диаграми по UML 2.0

Съвместно използване на Съвместно използване на моделитемоделите

В примерната схема в композиция е отношението между книга В примерната схема в композиция е отношението между книга и страница. Самата библиотечна книга участва в агрегация и страница. Самата библиотечна книга участва в агрегация към библиотеката. Библиотеката може да съществува и без към библиотеката. Библиотеката може да съществува и без книгите (заети са) всичките, книгата не може да съществува книгите (заети са) всичките, книгата не може да съществува без страниците си (те са неразделна част) от книгата:без страниците си (те са неразделна част) от книгата:

Page 23: Тема  4 .  Структурни диаграми по UML 2.0

Съвместно използване на Съвместно използване на моделитемоделите

В основата на йерархията са два основни класа- В основата на йерархията са два основни класа- BookBook и и StudentStudent. Всеки от тях описва общи обекти, притежава общи . Всеки от тях описва общи обекти, притежава общи атрибути за всички обекти, които ще ги наследят. атрибути за всички обекти, които ще ги наследят.

BookBook е базов клас на библиотечната книга; е базов клас на библиотечната книга; StudentStudent е базов клас за всички читатели на студентската е базов клас за всички читатели на студентската

библиотека, които го наследяват;библиотека, които го наследяват; ReaderReader е специализиран студент, който използва е специализиран студент, който използва

студентската библиотека. Обектът съдържа атрибути, като студентската библиотека. Обектът съдържа атрибути, като списък на заетите книги, например списък на заетите книги, например checkedBooks ArrayListcheckedBooks ArrayList;;

Книгата се Книгата се състои от (е композицияот) състои от (е композицияот) страници (клас страници (клас PagePage). Композицията показва, че книгата може да има 1 или ). Композицията показва, че книгата може да има 1 или повече страници. Част от методите на повече страници. Част от методите на BookBook трябва да трябва да работят със страниците, които се имплементират в класа работят със страниците, които се имплементират в класа BookBook и са достъпни за наследниците на класа. и са достъпни за наследниците на класа.

Класът Класът LibraryBookLibraryBook е специализиран клас на е специализиран клас на BookBook и като и като такъв има допълнителни атрибути, например дата на такъв има допълнителни атрибути, например дата на придобиване, статус (заета/незаета- придобиване, статус (заета/незаета- borrowingStatus booleanborrowingStatus boolean), ), идентификационен номер, който използват при търсене в идентификационен номер, който използват при търсене в библиотеката и други. библиотеката и други.

Page 24: Тема  4 .  Структурни диаграми по UML 2.0

Съвместно използване на Съвместно използване на моделитемоделите

BorrowingBorrowing се използва за имплементиране на се използва за имплементиране на асоциацията между читател и книга в библиотеката. асоциацията между читател и книга в библиотеката. Прекъснатата линия в описанието на Прекъснатата линия в описанието на UML UML показва тази показва тази релация чрез класа релация чрез класа BorrowingBorrowing.. В простия случай В простия случай връзката се маркира чрез етикет (обозначение на връзката се маркира чрез етикет (обозначение на двойната релация). Използването на клас означава, че двойната релация). Използването на клас означава, че асоциацията (връзката) между класовете се управлява от асоциацията (връзката) между класовете се управлява от класа;класа;

Между класовете Между класовете LibraryLibrary и и LibraryBookLibraryBook има отношение има отношение агрегация, което означава, че при унищожаването на агрегация, което означава, че при унищожаването на класа, който съдържа в себе си класа, който съдържа в себе си Съвкупност Съвкупност (aggregation) (aggregation) елементът не се унищожава от това. елементът не се унищожава от това. “При “При унищожаване на библиотеката, книгите, които са унищожаване на библиотеката, книгите, които са били в нея се запазват”;били в нея се запазват”;

Между класовете Между класовете PagePage и и BookBook има отношение състав има отношение състав (композиция (композиция compositioncomposition ), което означава неделимост в ), което означава неделимост в организацията на елементите. организацията на елементите. “При унищожаване на “При унищожаване на книгата се унищожават и страниците, от които тя се книгата се унищожават и страниците, от които тя се състои”състои”. .

Page 25: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книга Реализация на композиция чрез код на Java Реализация на композиция чрез код на Java import java.util.ArrayList; import java.util.ArrayList; class Pageclass Page{{ private int pageNum;private int pageNum; private String pageContent;private String pageContent; public Page(){public Page(){

pageNum =1;pageNum =1; }} public Page(String write, int page ){public Page(String write, int page ){

pageContent = write; pageNum=page;pageContent = write; pageNum=page; }} public String getContent() {public String getContent() {

return pageContent;return pageContent; }} public int getPageNum() {public int getPageNum() {

return pageNum;return pageNum; }} public void setContent(String write, int page) {public void setContent(String write, int page) {

pageContent = write; pageNum=page;pageContent = write; pageNum=page; }}} }

Page 26: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книгаКомпозиция на книга от странициКомпозиция на книга от странициpublic class Book {public class Book {// композиция на // композиция на страницитестраниците елементи (части) елементи (части) // в множество // в множество книгакнига ( цяло ) с мултипликатор 1..* ( цяло ) с мултипликатор 1..*

private ArrayList pages; // имплементация чрез списъкprivate ArrayList pages; // имплементация чрез списък// номер на старницата е индекса в списъка// номер на старницата е индекса в списъка// съдържанието е низ от символи// съдържанието е низ от символи

public Book() { // default constructorpublic Book() { // default constructorpages = new ArrayList(1); // осигуряване на 1..*pages = new ArrayList(1); // осигуряване на 1..*pages.add(0, "Book Title" ); // съдържание на pages.add(0, "Book Title" ); // съдържание на

корицатакорицата}}public Book(int numP) { // експлицитен по брой странициpublic Book(int numP) { // експлицитен по брой страници

pages = new ArrayList(numP);pages = new ArrayList(numP);}}

Page 27: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книга// вмъкване на страница// вмъкване на страница

public void insertPage( int pageNum, String pageContent ) public void insertPage( int pageNum, String pageContent ) {{

try {try { pages.add(pageNum, pageContent );pages.add(pageNum, pageContent );}}catch(IndexOutOfBoundsException e) {catch(IndexOutOfBoundsException e) {}}

}}// добавяне на страница в края// добавяне на страница в края

public void insertPage( String pageContent ) {public void insertPage( String pageContent ) {pages.add(pageContent);pages.add(pageContent);

}}

Page 28: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книга// промяна на съдържание на страница// промяна на съдържание на страница public void replacePage( int pageNum, String pageContent ) {public void replacePage( int pageNum, String pageContent ) { try {try {

pages.set(pageNum,pageContent);pages.set(pageNum,pageContent); }} catch(IndexOutOfBoundsException e) {catch(IndexOutOfBoundsException e) { }} }}

Page 29: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книга// изтриване на страница без корицата (0)// изтриване на страница без корицата (0) public void deletePage( int pageNum ) {public void deletePage( int pageNum ) { try{try{ pages.remove(pageNum);pages.remove(pageNum); if(pages.size()>0)if(pages.size()>0) super.setContent(pages.get(pageNum-super.setContent(pages.get(pageNum-

1).toString(),pageNum-1);1).toString(),pageNum-1); else //премахва само съдържанието на else //премахва само съдържанието на корицата (0)корицата (0) super.setContent("", 0);super.setContent("", 0); }} catch (IndexOutOfBoundsException e){catch (IndexOutOfBoundsException e){ }} }}

Page 30: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книга// изтриване на страница включващо и // изтриване на страница включващо и

корицатакорицата/* !!!! кодът да се използва само при 0..*/* !!!! кодът да се използва само при 0..*

public void deletePage( int pageNum ) {public void deletePage( int pageNum ) {try{try{

pages.remove(pageNum);pages.remove(pageNum);}}catch (IndexOutOfBoundsException e){catch (IndexOutOfBoundsException e){}}

}}*/*/

Page 31: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книга// размяна на страници // размяна на страници

public void exchangePages( int pageNumFrom, int pageNumTo ) {public void exchangePages( int pageNumFrom, int pageNumTo ) {try {try {

Object fromText = pages.remove(pageNumFrom);Object fromText = pages.remove(pageNumFrom);Object toText = pages.set( pageNumTo, Object toText = pages.set( pageNumTo,

(String)fromText);(String)fromText);pages.add(pageNumFrom,toText.toString());pages.add(pageNumFrom,toText.toString());

}}catch( IndexOutOfBoundsException e ) {catch( IndexOutOfBoundsException e ) {}}

}}// връщане на списъка страници // връщане на списъка страници

public ArrayList getPages() {public ArrayList getPages() {return pages;return pages;

}}

Page 32: Тема  4 .  Структурни диаграми по UML 2.0

Кодиране на Кодиране на композицията между композицията между

страница и книгастраница и книга// тестова програма// тестова програма public static void main(String[] args) {public static void main(String[] args) { Book myBook = new Book();Book myBook = new Book(); for(int i = 0; i < myBook.getPages().size() ; i++) {for(int i = 0; i < myBook.getPages().size() ; i++) { System.out.println( myBook.getPages().get( i ) );System.out.println( myBook.getPages().get( i ) ); }} System.out.println("Initial content");System.out.println("Initial content"); myBook.insertPage("1"); myBook.insertPage("2"); myBook.insertPage("1"); myBook.insertPage("2");

myBook.insertPage("3");myBook.insertPage("3"); myBook.insertPage("4"); myBook.insertPage("5"); myBook.insertPage("4"); myBook.insertPage("5");

myBook.insertPage("6");myBook.insertPage("6"); myBook.insertPage("7"); myBook.insertPage("8"); myBook.insertPage("7"); myBook.insertPage("8");

myBook.insertPage("9");myBook.insertPage("9"); myBook.deletePage( 7 ); myBook.insertPage( 2, "31" ); myBook.deletePage( 7 ); myBook.insertPage( 2, "31" ); myBook.insertPage( 4, "41" ); myBook.insertPage( 6, "51" );myBook.insertPage( 4, "41" ); myBook.insertPage( 6, "51" ); myBook.exchangePages( 6, 1 );myBook.exchangePages( 6, 1 ); for(int i = 0; i < myBook.getPages().size() ; i++) {for(int i = 0; i < myBook.getPages().size() ; i++) {

System.out.println( myBook.getPages().get( i ) );System.out.println( myBook.getPages().get( i ) ); }} } // } // mainmain} // край на класа} // край на класа

Page 33: Тема  4 .  Структурни диаграми по UML 2.0

KKодиране на агрегацияодиране на агрегацияimport java.util.*;import java.util.*;public class Library {public class Library {private ArrayList<LibraryBook> books = new ArrayList<LibraryBook>(); private ArrayList<LibraryBook> books = new ArrayList<LibraryBook>(); // list of library books// list of library booksprivate ArrayList<Borrowing> borrowing = new private ArrayList<Borrowing> borrowing = new

ArrayList<Borrowing>(); ArrayList<Borrowing>(); // list of borrowing// list of borrowingprivate ArrayList<Reader> reader = new ArrayList<Reader>(); private ArrayList<Reader> reader = new ArrayList<Reader>(); // list of readers// list of readers

public ArrayList<Borrowing> getBorrowing() {public ArrayList<Borrowing> getBorrowing() {return borrowing;return borrowing;

}}public ArrayList<LibraryBook> getBooks() {public ArrayList<LibraryBook> getBooks() {

return books;return books;}}public ArrayList<Reader> getReaders() {public ArrayList<Reader> getReaders() {

return reader;return reader;}}public void addReader( Reader rdr ) {public void addReader( Reader rdr ) {

reader.add(rdr);reader.add(rdr);}}

Page 34: Тема  4 .  Структурни диаграми по UML 2.0

KKодиране на агрегацияодиране на агрегация//return Reader FN//return Reader FNpublic String findReader(Reader toFind ) {public String findReader(Reader toFind ) {

boolean res = reader.contains(toFind);boolean res = reader.contains(toFind);if(res)if(res) return toFind.GetFN();return toFind.GetFN();elseelse return null;return null;

}}//return book ID//return book IDpublic String findBook(LibraryBook toFind ) {public String findBook(LibraryBook toFind ) {

boolean res = books.contains(toFind);boolean res = books.contains(toFind);if(res)if(res) return toFind.GetID();return toFind.GetID();elseelse return null;return null;

}}

Page 35: Тема  4 .  Структурни диаграми по UML 2.0

KKодиране на агрегацияодиране на агрегацияpublic static void main(String[] args) {public static void main(String[] args) {

Library oLib = new Library();Library oLib = new Library();Reader oRd = new Reader("reader1", "046050");Reader oRd = new Reader("reader1", "046050");oLib.getReaders().add(oRd);oLib.getReaders().add(oRd);oRd.setLibrary(oLib);oRd.setLibrary(oLib);……

oLib.getBooks().add(new LibraryBook("ID1"));oLib.getBooks().add(new LibraryBook("ID1"));……..Object[] arr = oLib.getReaders().toArray();Object[] arr = oLib.getReaders().toArray();for(int i=0; i<arr.length; i++) for(int i=0; i<arr.length; i++) System.out.println(arr[i].toString());System.out.println(arr[i].toString());arr = oLib.getBooks().toArray();arr = oLib.getBooks().toArray();for(int j=0; j<arr.length; j++) for(int j=0; j<arr.length; j++) System.out.println(arr[j].toString());System.out.println(arr[j].toString());String res = oLib.findReader(new Reader("reader3", String res = oLib.findReader(new Reader("reader3",

"046052"));"046052"));System.out.println(res);System.out.println(res);res = oLib.findBook(new LibraryBook("ID5"));res = oLib.findBook(new LibraryBook("ID5"));System.out.println(res);System.out.println(res);

}}}}

Page 36: Тема  4 .  Структурни диаграми по UML 2.0

KKодиране на агрегацияодиране на агрегацияpublic class CCourse {public class CCourse {private HashSet exams;private HashSet exams;//......//...... public HashSet getExams() {public HashSet getExams() { return exams; }return exams; } private void setExams(HashSet ex) {private void setExams(HashSet ex) { exams = ex; }exams = ex; }// aggregation course <=> seminars // aggregation course <=> seminars ////Премахване на courseПремахване на course Курсът и неговите семинари се премахватКурсът и неговите семинари се премахватpublic void remove() {public void remove() {

if(exams !=null) {if(exams !=null) { //оригиналът се копира, защото не се допуска//оригиналът се копира, защото не се допуска //изтриване на елементите на колекцията по//изтриване на елементите на колекцията по //време на итерирването //време на итерирването HashSet set = (HashSet) getExams().clone();HashSet set = (HashSet) getExams().clone(); Iterator iterator = set.iterator();Iterator iterator = set.iterator(); // премахване на упражненията на курса// премахване на упражненията на курса while(iterator.hasNext()) {while(iterator.hasNext()) { CExams exam = (CExams)iterator.next();CExams exam = (CExams)iterator.next(); getExams().remove(exam);getExams().remove(exam); }}

}}// Премахване на инстанцията от записващата среда!!!!// Премахване на инстанцията от записващата среда!!!! }}//......//......}}

Page 37: Тема  4 .  Структурни диаграми по UML 2.0

ИнтерфейсиИнтерфейси

Определение: Определение: Интерфейса е дефиниция на сувкупност от един Интерфейса е дефиниция на сувкупност от един

или повече методи и нула или повече атрибути.или повече методи и нула или повече атрибути.

Предназначение:Предназначение:Интерфейсите служат за дефиниция на множество Интерфейсите служат за дефиниция на множество

от поведения на обект от даден клас. Те се от поведения на обект от даден клас. Те се имплементират чрез класове или компоненти. За имплементират чрез класове или компоненти. За да имплементира един интерфейс, класът да имплементира един интерфейс, класът трябва да включва в себе си дефиниция на трябва да включва в себе си дефиниция на метод(ите) дефинирани в интерфейса.метод(ите) дефинирани в интерфейса.

Page 38: Тема  4 .  Структурни диаграми по UML 2.0

ИнтерфейсиИнтерфейси

Пример за интерфейсПример за интерфейс

Даден е класът Даден е класът StudentStudent имплементиращ имплементиращ интерфейса интерфейса SerializableSerializable и и SearchableSearchable. За . За да се имплементира интерфейса да се имплементира интерфейса SearchableSearchable, , StudentStudent трябва да включва трябва да включва метод, наречен метод, наречен findfind, с параметър , с параметър критерия за търсене. Има 2 начина за критерия за търсене. Има 2 начина за представяне на интерфейсите чрез представяне на интерфейсите чрез структурни диаграми:структурни диаграми:

Page 39: Тема  4 .  Структурни диаграми по UML 2.0

Структурни диаграми на Структурни диаграми на интерфейсите интерфейсите

Диаграма на примерния интерфейсДиаграма на примерния интерфейс

Page 40: Тема  4 .  Структурни диаграми по UML 2.0

Правила за имплементиране Правила за имплементиране на интерфейситена интерфейсите

Интерфейсите се декларират като класоветеИнтерфейсите се декларират като класовете. . Разликата е използването на ключовата дума Разликата е използването на ключовата дума interfaceinterface вместо вместо classclass . Както класовете и интерфейсите могат да . Както класовете и интерфейсите могат да са наследници на нула или повече други интерфейси с са наследници на нула или повече други интерфейси с ключовата дума ключовата дума extendsextends. Това е единственият начин . Това е единственият начин (ограничен) чрез който в Java може да се реализира (ограничен) чрез който в Java може да се реализира множествено наследяване.множествено наследяване.

Документирането им е като на класоветеДокументирането им е като на класовете. . Дефинициите не включват тяло с кодДефинициите не включват тяло с код. Целта е да се . Целта е да се

дефинира множество от декларации (сигнатури) на дефинира множество от декларации (сигнатури) на методите, не и тяхната същинска имплементация (тяло методите, не и тяхната същинска имплементация (тяло на методите).на методите).

В интерфейсите на Java може да има атрибути, но те В интерфейсите на Java може да има атрибути, но те трябва да се декларират static, които са фактически трябва да се декларират static, които са фактически именовани константи, те не могат да се променят. именовани константи, те не могат да се променят.

Page 41: Тема  4 .  Структурни диаграми по UML 2.0

Правила за имплементиране Правила за имплементиране на интерфейситена интерфейсите

Пример:Пример:public interface Months {public interface Months { (static) int(static) int JANUARY = 1, FEBRUARY = 2, MARCH = 3, JANUARY = 1, FEBRUARY = 2, MARCH = 3, APRIL = 4, MAY = 5, JUNE = 6, JULY = 7, APRIL = 4, MAY = 5, JUNE = 6, JULY = 7, AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10,AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10, NOVEMBER = 11, DECEMBER = 12;NOVEMBER = 11, DECEMBER = 12;}}В интерфейсите могат да се дефинират и В интерфейсите могат да се дефинират и

статични класове, в които да се дефинират статични класове, в които да се дефинират методи; методи;

Page 42: Тема  4 .  Структурни диаграми по UML 2.0

Правила за имплементиране Правила за имплементиране на интерфейситена интерфейсите

Пример интерфейс с клас :Пример интерфейс с клас :public interface GlobalData {public interface GlobalData { public class FileGlobalData {public class FileGlobalData { public void getArray(ArrayList<String> Data) {public void getArray(ArrayList<String> Data) { String str;String str; try { try {

RandomAccessFile fin = new RandomAccessFile("<път до файла> \\RandomAccessFile fin = new RandomAccessFile("<път до файла> \\input.txt","r");input.txt","r"); while((str = fin.readLine()) != null ) {while((str = fin.readLine()) != null ) { Data.add(str.trim().toLowerCase());Data.add(str.trim().toLowerCase()); }} fin.close();fin.close(); } } catch(EOFException e) {catch(EOFException e) { System.out.println("End of file encountered");System.out.println("End of file encountered"); }} catch(FileNotFoundException e) {catch(FileNotFoundException e) { System.out.println("FileNotFound");System.out.println("FileNotFound"); }} catch(IOException e) {catch(IOException e) { System.out.println("IOException encountered");System.out.println("IOException encountered"); }}

}} }}}}

Page 43: Тема  4 .  Структурни диаграми по UML 2.0

Правила за имплементиране Правила за имплементиране на интерфейситена интерфейсите

Клас за предаване на глобални данни и зареждането им от интерфейса Клас за предаване на глобални данни и зареждането им от интерфейса GlobalData:GlobalData:

import java.util.ArrayList;import java.util.ArrayList;public class MyClass {public class MyClass {static final int lSize=400000;static final int lSize=400000;static private ArrayList<String> Data=new ArrayList<String>(MyClass.lSize);static private ArrayList<String> Data=new ArrayList<String>(MyClass.lSize);

MyClass() {MyClass() {GlobalData.FileGlobalData fc = new GlobalData.FileGlobalData();GlobalData.FileGlobalData fc = new GlobalData.FileGlobalData();fc.getArray(Data);fc.getArray(Data);

}}public static void main(String[] args) {public static void main(String[] args) { System.out.println("File loading... ");System.out.println("File loading... "); MyClass oMyClass = new MyClass();MyClass oMyClass = new MyClass(); int iSize = FileTest.Data.size(); // брой прочетени низовеint iSize = FileTest.Data.size(); // брой прочетени низове System.out.println("Loaded... ");System.out.println("Loaded... ");

}} finally{finally{// код за обработка на неприхванати грешки// код за обработка на неприхванати грешки };};}}

Page 44: Тема  4 .  Структурни диаграми по UML 2.0

Имплементиране на Имплементиране на интерфейситеинтерфейсите

Предефиниран интерфейс Ipersistent:Предефиниран интерфейс Ipersistent:Операции: Операции: Премахване на обект от записващата среда.Премахване на обект от записващата среда.

Синтаксис: Синтаксис: boolean remove(); boolean remove(); Изисквания:Изисквания:– Обектът не бива повече да е достъпен за другите обекти;Обектът не бива повече да е достъпен за другите обекти;– Премахването не е задължително изтриване на обекта. То може Премахването не е задължително изтриване на обекта. То може

да да означава неговото архивиране; означава неговото архивиране; Запис на обекта в записващата среда. Изисква обектът да се Запис на обекта в записващата среда. Изисква обектът да се

запише.запише.Синтаксис: Синтаксис: void save(); void save();

Създаване на обект от записваща среда.Създаване на обект от записваща среда.Синтаксис: Синтаксис: void retrieve(); void retrieve(); Изисквания:Изисквания:– Обектът не се съдържа задължително в записващата среда;Обектът не се съдържа задължително в записващата среда;– Ако обектът съществува в записващата среда, трябва даАко обектът съществува в записващата среда, трябва да се се

създаде в паметта; създаде в паметта;

Page 45: Тема  4 .  Структурни диаграми по UML 2.0

Предефиниран интерфейс Предефиниран интерфейс IIPPersistentersistent

public interface IPersistentpublic interface IPersistent{{/**/** * Премахване на обект от записващата среда* Премахване на обект от записващата среда*/*/boolean remove();boolean remove();/**/** * Запис на обекта в записващата среда* Запис на обекта в записващата среда */*/void save();void save();/**/** * Създаване на обект от записваща среда* Създаване на обект от записваща среда*/*/void retrieve();void retrieve();}}

Page 46: Тема  4 .  Структурни диаграми по UML 2.0

Предефиниран интерфейс Предефиниран интерфейс IIPPersistentersistent

Пример:Пример:

abstract public class Seminar implements IPersistent {abstract public class Seminar implements IPersistent { public public boolean remove() boolean remove() {{ // // имплементацияимплементация

return true;return true; }} public public void save() void save() {{ // // имплементацияимплементация }} public public void retrieve() void retrieve() {{ // // имплементацияимплементация }}........}}

Page 47: Тема  4 .  Структурни диаграми по UML 2.0

Интерфейс IPersistentИнтерфейс IPersistentКодове за реализация на IPersistent:Кодове за реализация на IPersistent:/**/** ** * Премахване на Seminar от записващата среда* Премахване на Seminar от записващата среда ** * @postcondition Обектът Seminar не бива повече да е достъпен за другите обекти * @postcondition Обектът Seminar не бива повече да е достъпен за другите обекти

** */*/public boolean remove()public boolean remove(){{ if (instructors != null) {if (instructors != null) { // Асоциация на Seminar с водещите преподаватели// Асоциация на Seminar с водещите преподаватели Vector instructorList = instructors.elements();Vector instructorList = instructors.elements(); while (instructorList.hasMoreElements()) {while (instructorList.hasMoreElements()) { Professor professor =Professor professor = (Professor)instructorList.nextElement();(Professor)instructorList.nextElement(); professor.removeSeminar(this);professor.removeSeminar(this); }} }} //// // Асоциация на Seminar с курс // Асоциация на Seminar с курс //// if (getCourse() != null) {if (getCourse() != null) { getCourse.removeSeminar(this);getCourse.removeSeminar(this); setCourse(null);setCourse(null); }} // Специфичен за записващата среда код по премахването => връща резултат от // Специфичен за записващата среда код по премахването => връща резултат от

записванетозаписването}}

Page 48: Тема  4 .  Структурни диаграми по UML 2.0

Интерфейс IPersistentИнтерфейс IPersistent/**/** * Запис на Seminar в записващата среда * Запис на Seminar в записващата среда ** * @postcondition Seminar е записан в записващата среда* @postcondition Seminar е записан в записващата среда */*/public void save()public void save(){{ // Специфичен за записващата среда код// Специфичен за записващата среда код}}/**/** * Създаване на Seminar от записваща среда * Създаване на Seminar от записваща среда ** @precondition None. Seminar не се съдържа задължително в записващата @precondition None. Seminar не се съдържа задължително в записващата

среда.среда. * @postcondition Ако Seminar съществува в записващата среда, трябва да * @postcondition Ако Seminar съществува в записващата среда, трябва да

се се се създаде в паметта.се създаде в паметта. */*/public void retrieve()public void retrieve(){{ // Специфичен за записващата среда код за четене и създаване на // Специфичен за записващата среда код за четене и създаване на

SeminarSeminar}}