Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы Case-средства СУ

.pdf
Скачиваний:
43
Добавлен:
11.02.2015
Размер:
1.16 Mб
Скачать

2.Что такое динамический полиморфизм?

3.Что такое наследование и как это «выражается» в коде?

4.Чистая виртуальная функция – что это такое, зачем применятся?

5.Какой тип видимости у методов класса по умолчанию?

Список литературы

1.Гамма Э.и др. - Приемы объектно-ориентированного проектирования. Паттерны проектирования – 2010г.

2.Влиссидес Д. - Применение шаблонов проектирования. Дополнительные штрихи –

2003г.

3.Ларман К. - Применение UML и шаблонов проектирования. – 2004г.

4.Фримен Эр., Фримен Эл., Сьерра К., Бейтс Б. - Паттерны проектирования – 2011г

11

Лабораторная работа №2. Использование паттерна Стратегия

Цель занятия: познакомится с принципом использования паттерна Стратегия при выборе архитектуры ПО и последующей реализации

Порядок выполнения работы:

1.Ознакомится с примером задания и разработанным кодом

2.Выполнить общую часть лабораторной работы

3.Выполнить индивидуальную часть лабораторной работы

Стратегия (англ. Strategy) — поведенческий шаблон проектирования,

предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путем определения соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.

Задача

По типу клиента (или по типу обрабатываемых данных) выбрать подходящий алгоритм, который следует применить. Если используется правило, которое не подвержено изменениям, нет необходимости обращаться к шаблону «стратегия».

Когда применяется:

Программа должна обеспечивать различные варианты алгоритма или поведения

Нужно изменять поведение каждого экземпляра класса

Необходимо изменять поведение объектов на стадии выполнения

Введение интерфейса позволяет классам-клиентам ничего не знать о классах, реализующих этот интерфейс и инкапсулирующих в себе конкретные алгоритмы

Способ решения

Отделение процедуры выбора алгоритма от его реализации. Это позволяет сделать выбор на основании контекста.

Диаграмма классов

12

Общая часть лабораторной работы

В лекционном курсе была рассмотрена диаграмма классов, приведенная ниже.

Теоретические обоснования и идеи заложенные в основу этой диаграммы также были рассмотрены. Задача: по имеющейся диаграмме классов написать программный код,

используя паттерн Стратегия.

1. Создаем новый пустой проект в Visual Studio и выбираем соответствующие настройки:

13

2. Создаем интерфейс, в котором будет содержаться описание поведения уток:

Для интерфейса QuackBehavior нужно создать только заголовочный файл. Для реализации динамического полиморфизма используем чистую виртуальную функцию, определяющую вариант "крякания".

#pragma once #include <iostream> using namespace std;

class QuackBehavior

{

public:

virtual void Quack()=0;

};

3. Реализуем поведение уток. Утки могут "молчать", крякать и пищать. Реализуем класс поведения "крякание", который наследуется от интерфейса QuackBehavior.

Заголовочный файл: содержит конструктор, деструктор и метод void Quack(), который будет определять тип кряканья. Обратите внимание что метод имеет такое название, как и в случае с чистой виртуальной функцией. Это необходимо в рамках реализации динамического полиморфизма.

#pragma once

#include "quackbehavior.h" class QuackQuack :

14

public QuackBehavior

{

public: QuackQuack(); ~QuackQuack(void); void Quack();

};

Файл реализации: реализован метод void Quack().

#include "QuackQuack.h"

QuackQuack::QuackQuack()

{

}

QuackQuack::~QuackQuack(void)

{

}

void QuackQuack::Quack()

{

cout << "Quack-Quack ";

}

По аналогии необходимо реализовать все остальные классы с поведение уток. Во всех классах метод, определяющий "кряканье" будет иметь одинаковое название, однако в зависимости от типа утки будет использоваться разная реализация этого метода.

4. Реализация полета уток. Сначала, как и в случае с поведением, необходимо реализовать интерфейс от которого затем будем наследовать различные типы алгоритмов полета уток.

Реализация интерфейса FlyBehavior:

#pragma once #include <iostream> using namespace std;

class FlyBehavior

{

public:

virtual void Fly()=0; };

5. Реализация различные способов полета. Реализуем возможность полета утки:

Заголовочный файл:

#pragma once

#include "flybehavior.h" class FlyWithWings :

public FlyBehavior

{

public:

15

FlyWithWings(); ~FlyWithWings(void);

void Fly();

};

Файл реализации:

#include "FlyWithWings.h"

FlyWithWings::FlyWithWings()

{

}

FlyWithWings::~FlyWithWings(void)

{

}

void FlyWithWings::Fly()

{

cout << "Fly Duck Fly ";

}

Также реализуем второй вариант полета - FlyNoWay.

6. Реализуем класс Duck, от которого заем унаследуем все типы уток. К классу Duck

подключаем интерфейсы, отвечающие за полет и кряканье. Внутри класса Duck заводим переменные с типом соответствующих интерфейсов. Реализуем набор методов,

определенных на диаграмме классов.

#pragma once #include <iostream> using namespace std;

#include "FlyBehavior.h" #include "QuackBehavior.h"

class Duck

{

FlyBehavior* f1; QuackBehavior* q1;

public:

void SetFlyBehavior (FlyBehavior* f)

{

this->f1=f;

}

void Fly()

{

f1->Fly();

}

void SetQuackBehavior (QuackBehavior* q)

{

this->q1=q;

}

void Quack()

16

{

q1->Quack();

}

virtual void display()=0;

};

7. Создаем класс с описанием конкретной утки. Рассмотрим на примере DecoyDuck:

Заголовочный файл: DecoyDuck унаследован от класса Duck/ Реализуем единственный метод, отвечающий за отображение утки.

#pragma once #include "duck.h" class DecoyDuck :

public Duck

{

public: DecoyDuck(void); ~DecoyDuck(void); void display();

};

Файл реализации:

#include "DecoyDuck.h"

DecoyDuck::DecoyDuck(void)

{

}

DecoyDuck::~DecoyDuck(void)

{

}

void DecoyDuck::display()

{

cout << "Decoy" << endl;

}

По аналогии с классом DecoyDuck опредеяем также классы всех остальных уток. 8. Создаем реализацию, т.е. функцию main().

#include <iostream> using namespace std; #include "MallardDuck.h" #include "RubberDuck.h" #include "FlyWithWings.h" #include "FlyNoWay.h" #include "MuteQuack.h" #include "QuackQuack.h" #include "RedhedDuck.h" #include "DecoyDuck.h" #include "Squeak.h" #include <conio.h>

void main()

{

Duck **di;

17

int a; int n;

FlyBehavior *fb_flywithwings, *fb_flynoway; QuackBehavior *qb_quackquack, *qb_mutequack, *qb_squeak;

qb_quackquack = new QuackQuack(); qb_mutequack = new MuteQuack(); qb_squeak = new Squeak(); fb_flywithwings = new FlyWithWings(); fb_flynoway = new FlyNoWay();

cout << "How many ducks in the pool?" <<endl; cin >>a;

di = new Duck*[a];

for (int i=0; i<a; i++)

{

cout << "Enter Duck-type: 1 - Mallard, 2 - Redhead, 3 - Rubber, 4 - Decoy" <<endl; cin >> n;

switch (n)

{

case 1:

di[i]=new MallardDuck(); di[i]->SetQuackBehavior(qb_quackquack); di[i]->SetFlyBehavior(fb_flywithwings);

break; case 2:

di[i]=new RedhedDuck(); di[i]->SetQuackBehavior(qb_quackquack); di[i]->SetFlyBehavior(fb_flywithwings);

break;

case 3:

di[i]=new RubberDuck(); di[i]->SetQuackBehavior(qb_squeak); di[i]->SetFlyBehavior(fb_flynoway);

break; case 4:

di[i]=new DecoyDuck(); di[i]->SetQuackBehavior(qb_mutequack); di[i]->SetFlyBehavior(fb_flynoway);

break; default:

di[i]=new MallardDuck(); di[i]->SetQuackBehavior(qb_quackquack); di[i]->SetFlyBehavior(fb_flywithwings);

break;

}

}

18

for (int i=0; i<a; i++)

{

di[i]->Fly(); di[i]->Quack(); di[i]->display();

}

for (int i=0; i<a; i++)

{

delete di[i];

}

delete [] di;

delete fb_flywithwings; delete fb_flynoway; delete qb_quackquack; delete qb_mutequack; delete qb_squeak;

getch();

}

В начале программы спрашиваем у пользователя, сколько уток нам необходимо, затем задаем параметры этих уток, т.е. выбираем их типы. За счет использования динамического полиморфизма получаем поведение всех заданных уток.

Индивидуальные задания

Вариант 1

Расчет стоимости авиабилета: Пассажир может купить билет в один из 3 классов:

эконом, бизнес и первый и так называемые «горящие билеты» по выгодной цене.

Соответственно цена на билет также будет зависеть от расположения места (у окна или не у окна) и возможности сдать авиабилет (не позднее чем за 3 часа, в случае покупки билета в первый класс, не позднее, чем за 3 суток с оплатой комиссии 50 долл, в случае покупки билета в бизнес класс или эконом класс; невозможно вернуть при покупке «горящих» билетов).

Вариант 2

Расчет стоимости бронирования номера: клиент может забронировать номер в один из 4 классов: стандартный, улучшенный, полулюкс и люкс. Соответственно цена за номер

19

также будет зависеть от вида из окна (на море или не на море) и сезона продажи

(туристический пик, обычный сезон, не сезон).

Вариант 3

Реализация поведения персонажей компьютерной игры: пользователь может выбрать одного из персонажей компьютерной игры – короля, королеву, рыцаря или тролля. Соответственно каждый из персонажей может владеть тем или иным видом оружия (одновременно только одним): мечом, луком со стрелами, арбалетом. В

зависимости от команды, к которой принадлежит пользователь, «цвет» персонажа может быть: синим, красным, желтым или зеленым.

Содержание отчета по лабораторной работе

По результатам выполнения лабораторной работы необходимо подготовить отчет,

вкотором должны содержаться:

код выполненной общей части задания лабораторной работы;

код выполненной индивидуальной части лабораторной работы.

Контрольные вопросы

1.Какие преимущества дает использование паттерна Стратегия?

2.Покажите на диаграмме классов, где используется механизм наследования.

3.Что такое интерфейс, чем он отличается от абстрактного класса?

4.Покажите на диаграмме классов, где используется механизм композиции? Какие преимущества по сравнению с наследованием он дает?

5.Покажите в коде программы место использования механизма композиции.

Список литературы

1.Гамма Э.и др. - Приемы объектно-ориентированного проектирования. Паттерны проектирования – 2010г.

2.Влиссидес Д. - Применение шаблонов проектирования. Дополнительные штрихи –

2003г.

3.Ларман К. - Применение UML и шаблонов проектирования. – 2004г.

4.Фримен Эр., Фримен Эл., Сьерра К., Бейтс Б. - Паттерны проектирования – 2011г

20

Соседние файлы в предмете Системы управления