Программирование >>  Разработка устойчивых систем 

1 ... 160 161 162 [ 163 ] 164 165 166 ... 196


void MountainBikeBuilder::buildWheelО { product ->addPa rt(new Bi cyclePa rt(Bi cycl ePa rt:

void MountainBikeBuilder::buildSeat() { product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt:

void MountainBikeBuilder::buildDerailleur() { product->addPart( new BicyclePart(BicyclePart::DERAILLEUR)):

void MountainBikeBuilder::buildHandlebar() { product->addPart( new BicyclePart(BicyclePart::HANDLEBAR)):

void MountainBikeBuilder::buildSprocket() { product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt:

void MountainBikeBuilder void MountainBikeBuilder

:buildRack() {} :buildShock() {

:WHEEL)):

:SEAT)):

:SPROCKET)):

product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt::SHOCK)):

Реализация TouringBikeBuilder void TouringBikeBuilder::buildFrame() { product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt::FRAME)):

void TouringBikeBuilder::buildWheelО { product->addPart(new BicyclePart(BicyclePart::WHEEL)):

publ1с:

BicycleTechnicianO { builder = 0: }

void setBuilder(BicycleBuilder* b) { builder = b: }

void constructO:

#endif BICYCLE H /:-

Класс Bicycle содержит eeicrop указателей на объекты BicyclePart, которые представляют части, используемые при сборке велосипедов. Чтобы начать сборку велосипеда, BicycleTechnician ( руководитель в этом примере) вызывает Bi cycle Builder: tcreate-productO для производного объекта BicycleBuilder. Функция BicycleTechnician::construct() вызывает все функции интерфейса BicycleBuilder (поскольку она не знает, с каким конкретным типом строителя имеет дело). Конкретные классы строителей опускают (через пустые тела функций) те действия, которые не относятся к типу собираемого велосипеда, как видно из следующего файла реализации:

: C10:Bicycle.cpp {0} {-mwcc} finclude Bicycle.h finclude <cassert> finclude <cstddef> using namespace std:

std::string BicyclePart::names[NPARTS] = { Frame . Wheel . Seat . Derailleur . Handlebar . Sprocket . Rack . Shock }:

Реализация MountainBikeBuilder void MountainBikeBuilder::buildFrame() { product->addPart(new BicyclePart(BicyclePart::FRAME)):



void TouringBikeBuilder::buildSeatO { product->addPart(new BicyclePartCBicyclePart::SEAT)):

void TouringBikeBuilder::buildDerailleur() { product->addPart( new BicyclePartCBicyclePart::DERAILLEUR)):

void TouringBikeBuilder::buildHandlebarO { product->addPart( new BicyclePartCBicyclePart::HANDLEBAR)):

void TouringBikeBuilder::buildSprocketC) { product->addPartС new BicyclePartCBicyclePart::SPROCKET)):

void TouringBikeBuilder::buildRackO { product->addPartCnew BicyclePartCBicyclePart::RACK)):

voi d Touri ngBi keBui1der::bui1dShock О {}

Реализация RacingBikeBuilder void RacingBikeBuilder::buildFrameC) { product->addPartCnew BicyclePartCBicyclePart;:FRAME)):

void RacingBikeBuilder::buiIdWheelО { product->addPartС new BicyclePartCBicyclePart::WHEEL)):

void RacingBikeBuilder::buildSeatO { product->addPartCnew BicyclePartCBicyclePart::SEAT)):

void RacingBikeBuilder::buiIdDerai 11eurО {} void RacingBikeBuilder;:buildHandlebarC) { product->addPartC new BicyclePartCBicyclePart::HANDLEBAR));

void RacingBikeBuilder::buildSprocketO { product->addPart(new BicyclePartСBicyclePart::SPROCKET));

void RacingBikeBuilder::buildRackC) {} voi d Raci ngBi keBui1der::bui1dShock О {}

Реализация BicycleTechnician void BicycleTechnician::constructC) {

assertCbuilder):

builder->createProductC):

builder->buildFrameC):

builder->buildWheelC):

builder->buildSeatC):

bui1der->bui1dDerai 11 eurС);

builder->buildHandlebarC):

bui1der->bui1dSprocket С):

builder->buildRackC);

builder->buildShockC); } III:-

Оператор класса Bicycle вызывает соответствующий оператор для каждого объекта BicyclePart; этот объект выводит имя своего типа, чтобы вы видели, из каких частей состоит объект Bicycle. Пример:



/* Вывод:

Built a MountainBike

: СЮ:BuiIdBicycles.срр

{L} Bicycle

Паттерн Строитель.

#include <cstddef>

#include <iostream>

#include <map>

#i nclude <vector>

#include Bicycle.h

#include ../purge.h

using namespace std:

Сборка велосипеда с использованием конкретного строителя. Bicycle* buildMeABikeC

BicycleTechnicianS t. BicycleBuilder* builder) {

t.setBuilder(builder):

t.constructO:

Bicycle* b = builder->getProduct():

cout Built a builder->getBikeName() endl:

return b:

int mainO { Заказ на велосипеды map <string. size t> order: order[ mountain ] = 2: order[ touring ] = 1: order[ racing ] = 3:

Сборка велосипедов

vector<Bicycle*> bikes;

BicycleBuilder* m = new MountainBikeBuilder:

BicycleBuilder* t = new TouringBikeBuilder;

BicycleBuilder* r = new RacingBikeBuilder;

BicycleTechnician tech:

map<string. size t>::iterator it = order.beginO; whileCit != order.endO) { BicycleBuilder* builder; if(it->first == mountain )

builder = m; else if(it->first == touring )

builder = t; else if(it->first -= racing )

builder = r; for(size t i = 0; i < it->second: ++i)

bi kes.push back(bui1dMeABi ke(tech. bui1der)); ++it:

delete m; delete t; delete r;

Вывод информации о велосипедах for(size t i = 0; i < bikes.sizeO: ++i)

cout Bicycle: *bikes[i] endl: purge(bikes):



1 ... 160 161 162 [ 163 ] 164 165 166 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика