Автор работы: Пользователь скрыл имя, 06 Мая 2013 в 16:14, курсовая работа
Отделяет конструирование сложного объекта от его представления, позволяя использовать один и тот же процесс конструирования для создания различных представлений.
Паттерн Builder используется в таких случаях:
алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;
процесс конструирования должен обеспечивать различные представления конструируемого объекта.
• Постановка задачи
• Описание решения
• Литература
Отчёт о выполненной курсовой работе
По курсу «Програмирование»
Студента группы ПК-10-1
Гусейнова Мехти Юсиф оглы
Кафедра компьютерных технологий
ДНУ 2012 уч.г.
КУРСОВАЯ РАБОТА ПО КУРСУ ПРОГРАМИРОВАНИЕ
Содержание
• Постановка задачи
• Описание решения
• Литература
• Примечания
ООП И ООП-ПРОЭКТИРОВАНИЯ
Объектно-ориентированное
Основными чертами, характеристиками ООП являются: инкапсуляция, наследование, полиморфизм.
Основные понятия ООП:
Постановка задачи:
Описать паттерны проектирования заданные в индивидуальном задании, предоставить реализацию на С++ с примерами.
Паттерн Builder:
Отделяет конструирование сложного объекта от его представления, позволяя использовать один и тот же процесс конструирования для создания различных представлений.
Паттерн Builder используется в таких случаях:
Структура паттерна Builder:
Пример задачи:
Как пример задачи, решаемой паттерном Builder, в данном случае будет «конструирование» автомобиля. Пусть задан завод на котором создаются автомобили нескольких категорий: легковые спортивные, минивены и т.д. . Нам необходимо разработать удобную для пользователя программу которая будет выполнять действия по созданию автомобилей но при этом не будет различать какого они типа.
Описание решения:
Для большей
гибкости и возможности использования
программы воспользуемся
//Product
class Car
{
private:
string CarBrand_;
string Engine_;
int Wheel_;
int Door_;
string Colour_;
public:
Car() // конструктор без параметров инициализирующий поля класса
{
CarBrand_='\0';
Engine_='\0';
Wheel_=0;
Door_=0;
Colour_="White";
}
void setCarBrand (const string &CarBrand)//устанавливает значение поля //CarBrand марка автомобиля
{
CarBrand_=CarBrand;
}
void setEngine(const string &Engine)// устанавливает значение поля Engine //марка двигателя
{
Engine_=Engine;
}
void setWheel(const int &Wheel )// устанавливает значение поля Wheel //количество колес
{
Wheel_=Wheel;
}
void setDoor(const int& Door)// устанавливает значение поля Door
//количество дверей
{
Door_=Door;
}
void setColour(const string & Colour) )// устанавливает значение поля Colour
//цвет автомобиля
{
Colour_=Colour;
}
void getEvericing ()//вывод готовой продукции
{
cout<<"CarBrand="<<CarBrand_<<
<<"\tWheel="<<Wheel_<<"\tDoor=
<<"\tColour="<<Colour_<<endl;
}
};
Car – класс Product задающий каркас, который в какой-то мере определяет результат выполнения программы.
//Builder
class CarBuilder
{
protected:
Car car_;
public:
const Car& car()
{
return car_;
}
virtual void buildCarBrand() = 0
virtual void buildEngine() = 0;
virtual void buildWheel() = 0;
virtual void buildDoor() = 0;
virtual void buildColour() = 0; ;//чисто виртуальные
функции
//которая переопределяются в
};
CarBuilder – класс builder, который обеспечивает набор методов, которые будут использоваться классами Special Builder. Другими словами класс Builder предостовляет абстрактый интерфейс для создания объектов.// ConcreteBuilder
class UsualCar:public CarBuilder
{
public:
void buildCarBrand()
{
car_.setCarBrand("Mercedec");
}
void buildEngine()
{
car_.setEngine("V6");
}
void buildWheel()
{
car_.setWheel(4);
}
void buildDoor()
{
car_.setDoor(5);
}
void buildColour()
{
car_.setColour("Black");
}
};
class SportCar:public CarBuilder
{
public:
void buildCarBrand()
{
car_.setCarBrand("Bugatti Veyron");
}
void buildEngine()
{
car_.setEngine("x10");
}
void buildWheel()
{
car_.setWheel(4);
}
void buildDoor()
{
car_.setDoor(2);
}
void buildColour()
{
car_.setColour("Red");}};
UsualCar, SportCar – классы ConcreteBuilder которые определяют типы конечных объектов, реализуя методы предоставленные классом Builder.
class Concern
{
private:
CarBuilder* carBuilder_;//указатель на объект
public:
Concern():carBuilder_(nullptr)
~Concern()//деструктор удаление указателя
{
if(carBuilder_)
delete carBuilder_;
}
void carBuilder(CarBuilder* carBuilder)
{
if(carBuilder_)
delete carBuilder_;
carBuilder_ = carBuilder;
}
const Car& getCar()//возвращается результат построения
{
return carBuilder_->car();
}
void carconstruction()//составление объекта
{
carBuilder_->buildCarBrand();
carBuilder_->buildEngine();
carBuilder_->buildWheel();
carBuilder_->buildDoor();
carBuilder_->buildColour();
}
};
Concern – класс отвечающий за последовательность действий построения объекта. Принимает объект класса Concrete builder
как параметр и выполняет необходимые действия
int main()
{
Concern concern;
concern.carBuilder(new UsualCar);
concern.carconstruction();
Car makecar=concern.getCar();
makecar.getEvericing();
return 0;}
Паттерн: Pessimistic Offline Lock (Пессимистичная блокировка)
Pessimistic Offline Lock – предназначен для предотвращения конфликтов между параллельными бизнес-операциями, позволяя
одновременный доступ к данным только одной бизнес-транзакцие.
Пессимистическая блокировка реализуется в три этапа: определение необходимого типа блокировок, построение диспетчера блокировки и составление правил применения блокировок.
Существует 3 типа данной блокировки: монопольная блокировка записи(Exclusive write lock), монопольная блокировка чтения(Exclusive read lock), блокировка чтения/записи(read/write lock).
Блокировка записи(Exclusive write lock) – накладывает ограничение только на редактирование данных, игнорируя при этом процесс чтения. Блокировка чтения(Exclusive read lock) – полная противоположность блокировки записи.
Блокировка чтения/записи(read/write lock) – обеспечивает самое жесткое ограничение, обеспечивая полное ограничение доступа к информации находящейся в распоряжении другого пользователя.
Пессимистическая блокировка обеспечивает достаточно высокий уровень безопасности предотвращения коллизий, однако имеет и существенный недостаток: замедляет процесс выполнения операции доступа к элементам баз данных.
Как пример реализации данного паттерна будет представлен пример с блокировкой чтения/записи:
class Session
{
protected:
// типы данных которые будут
// считываться с базы данных
public:
void GetData(Session &ob1,fstream &base)
{………}
void ChangeData(Session &ob1)
{………}
void ShowData(Session &ob1,fstream &base)
{………}
};
////////////////////////
class Lock
{
private:
bool lock;
static bool Lnumber[10];
public:
int SetLock(int number)
{
lock=Chek(number);
if(lock==false)
{
cout<<"hahahahahahaha";
exit(1);
}
else
{
Lnumber[number]=true;
cout<<"this="<<Lock::Lnumber[
return 0;
}
}
static void GetLock(int number)
{
Lock::Lnumber[number]=0;
}
bool Chek(int number)
{
if(Lnumber[number]==true)
{
cout<<endl<<"Locked"<<endl;
return false;
}
else
{
cout<<endl<<"Open"<<endl;
return true;
}
}
};
bool Lock::Lnumber[10]={};
Lock – класс обеспечивающий блокировку данных.
С помощью
установки определённого
class Person
{
private:
int number;//номер, передающийся классу Lock для установления определённого //значения в массиве Lnumber
public:
Person():number(0){}
int SetData(Session &ob1)
{
//………//
Lock l1;
l1.SetLock(number);
//…………//
}
void GetData(Session &ob1)
void ChangeData(Session &ob1)
void Out_Lock()//снятие блокировки
};
ЛИСТИНГИ ПРОГРАММ
BUILDER
#include<iostream>
#include<string>
using namespace std;
////////////////////
//Product
class Car
{
private:
string CarBrand_;
string Engine_;
int Wheel_;
int Door_;
string Colour_;
public:
Car()
{
CarBrand_='\0';
Engine_='\0';
Wheel_=0;
Door_=0;
Colour_="White";
}
void setCarBrand (const string &CarBrand)
{
CarBrand_=CarBrand;
}
void setEngine(const string &Engine)
{
Engine_=Engine;
}
void setWheel(const int &Wheel)
{
Wheel_=Wheel;
}
void setDoor(const int& Door)
{
Door_=Door;
}
void setColour(const string & Colour)
{
Colour_=Colour;
}
void getEvericing ()
{
cout<<"CarBrand="<<CarBrand_<<
<<"\tWheel="<<Wheel_<<"\tDoor=
<<"\tColour="<<Colour_<<endl;
}
};
//////////////////////
//Builder
class CarBuilder
{
protected:
Car car_;
public:
const Car& car()
{
return car_;
}
virtual void buildCarBrand() = 0;
virtual void buildEngine() = 0;
virtual void buildWheel() = 0;
virtual void buildDoor() = 0;
virtual void buildColour() = 0;
};
//////////////////////////
class UsualCar:public CarBuilder
{
public:
void buildCarBrand()
{
car_.setCarBrand("Mercedec");
}
void buildEngine()
{
car_.setEngine("V6");
}
void buildWheel()
{
car_.setWheel(4);
}
void buildDoor()
{
car_.setDoor(5);
}
void buildColour()
{
car_.setColour("Black");
}
};
class SportCar:public CarBuilder
{
public:
void buildCarBrand()
{
car_.setCarBrand("Bugatti Veyron");
}
void buildEngine()
{
car_.setEngine("x10");
}
void buildWheel()
{
car_.setWheel(4);
}
void buildDoor()
{
car_.setDoor(2);
}
void buildColour()
{
car_.setColour("Red");
}
};
//////////////////////////////
class Concern
{
private:
CarBuilder* carBuilder_;
public:
Concern():carBuilder_(nullptr)
~Concern()
{
if(carBuilder_)
delete carBuilder_;
}
void carBuilder(CarBuilder* carBuilder)
{
if(carBuilder_)
delete carBuilder_;
carBuilder_ = carBuilder;
}
const Car& getCar()
{
return carBuilder_->car();
}
void carconstruction()
{
carBuilder_->buildCarBrand();
carBuilder_->buildEngine();
carBuilder_->buildWheel();
carBuilder_->buildDoor();
carBuilder_->buildColour();
}
};
int main()
{
Concern concern,concern_1;
concern.carBuilder(new UsualCar);
concern.carconstruction();
Car makecar=concern.getCar();
makecar.getEvericing();
concern.carBuilder(new SportCar);
concern.carconstruction();
Car makecare_1=concern.getCar();
makecare_1.getEvericing();
//Car makecare_2;
//makecare_2.getEvericing();
return 0;
}
PESSIMISTIC OFFLINE LOCK
#include<iostream>
#include<fstream>
#include<conio.h>
#include<STDLIB.h>
using namespace std;
//////////////////////////////
class Session//класс реализущий считывание и обработку информации с баз данных
{
protected:
char name[20];
char id[4];
public:
void GetData(Session &ob1,fstream &base)
{
base.read(reinterpret_cast<cha
}
void ChangeData(Session &ob1)
{
cout<<"What do you want to change?\n\tPress 'n' - name;\n\tPress 'i' - id"<<endl;
char ch;
ch=_getch();
switch(ch)
{
case 'n':
{
fflush(stdin);
cin.get(ob1.name,20);
}break;
case 'i':
{
fflush(stdin);
cin>>ob1.id;
}break;
}
}
void ShowData(Session &ob1,fstream &base)
{
base.write(reinterpret_cast<ch
}
};
////////////////////////
class Lock //класс реализующий блокировку
{
private:
bool lock;
static bool Lnumber[10];
public:
int SetLock(int number)
{
lock=Chek(number);
if(lock==false)
{
cout<<"hahahahahahaha";
exit(1);
}
else
{
Lnumber[number]=true;
cout<<"this="<<Lock::Lnumber[
return 0;
}
}
static void GetLock(int number)
{
Lock::Lnumber[number]=0;
}
bool Chek(int number)
{
if(Lnumber[number]==true)
{
cout<<endl<<"Locked"<<endl;
return false;
}
else
{
cout<<endl<<"Open"<<endl;
return true;