Observer и Decorator используются вместе c ++ * REVISED * - PullRequest
0 голосов
/ 24 января 2011

У меня есть программа, которая использует кофейню, которая делает напиток декоратором / упаковщиком ...

У меня также есть наблюдатель, и я пытаюсь связать это с напитком.Итак, когда заказ сделан на мобильный телефон, об этом уведомляется.Я не знаю, как сделать обновление ..

, если я прохожу класс TheOrder, я получаю ошибки!

drink.h

#ifndef _BEVERAGE_
#define _BEVERAGE_

#include "Starbuzz.h"


namespace CoffeeHouse {
namespace Decorator {
    //namespace Observer {
    //using namespace std;

    class Beverage {

    protected: std::string _description;

    protected: Beverage() : 
        _description( "Unknown Beverage" ) {
        }
    public: virtual ~Beverage() = 0 {
            }
    public: virtual std::string getDescription() const {
                return _description;
            }
    public: virtual double cost() const = 0;
    };

} // namespace Observer
} // namespace CoffeeHouse
//}
#endif

один из классов бетонных напитков -у меня есть 4 (эспрессо, houseblend, darkroast, без кофеина)

#ifndef _DARK_ROAST_
#define _DARK_ROAST_

#include "Starbuzz.h"

namespace CoffeeHouse {
namespace Decorator {
//namespace Observer {
class DarkRoast : public Beverage {

public: 

    DarkRoast() 
        {
    _description = "Dark Roast Coffee";
}
public: double cost() const {
    return 0.99;
}
};

} // namespace Observer
} 

#endif

декоратор напитков

#ifndef _BEVERAGE_DECORATOR_
#define _BEVERAGE_DECORATOR_

#include "Starbuzz.h"


namespace CoffeeHouse {
namespace Decorator {

class BeverageDecorator : public Beverage {

private: BeverageDecorator( const BeverageDecorator& ); // Disable copy constructor
private: void operator=( const BeverageDecorator& ); // Disable assignment operator

protected: BeverageDecorator() {
}
public: virtual ~BeverageDecorator() = 0 {
};
public: virtual std::string getDescription() const = 0;
};
//}
} // namespace Observer
} // namespace CoffeeHouse

#endif

Вот реализация для наблюдателя ..

Предметный класс

#ifndef _SUBJECT_
#define _SUBJECT_
#include "Observer.h"
#include <list>

namespace CoffeeHouse {
namespace Observers {

class Subject {

protected: virtual ~Subject() = 0 {
};
public: virtual void registerObserver( Observer* o ) = 0;
public: virtual void removeObserver( Observer* o ) = 0;
    public: virtual void notifyObservers() = 0;
};

} // namespace Observer
} 

#endif

вот конкретный предметный класс ..

#ifndef _THE_ORDER_
#define _THE_ORDER_

#include "Beverage.h"
#include <list>
#include <iostream>
#include "Order.h"

#pragma once;

using namespace CoffeeHouse::Decorator;
namespace CoffeeHouse {
namespace Observers {


class TheOrder : public Subject {



 private: mutable std::list< Observer* > _observers;
//private: mutable std::list< Order* > _orders;

//public: virtual ~Order() = 0 
//public: ~TheOrder();
public: void NewOrder(Beverage* bev)
        {
            _orders.push_front(new Order(bev));
       //_observers.push_front(new Order(bev));

        }

public: void registerObserver( Observer* o ) { assert( o );
    _observers.push_back(o);
}

public: void removeObserver( Observer* o ) { assert( o );
    _observers.remove(o);
}

public: void notifyObservers()  {
    for( std::list< Observer* >::iterator iterator = _observers.begin(); _observers.end() != iterator; ++iterator ) {
        Observer* observer = *iterator;
        observer->update();

    }
}


};
//}
} // namespace Observer
} // namespace CoffeeHouse

#endif

вот сотовый телефон1, который является наблюдателем

#ifndef _CELLPHONE1_
#define _CELLPHONE1_
#include <iostream>
using namespace std;

namespace CoffeeHouse {
namespace Observers {

class CellPhone1: public Observer {
public: 
    std::string _number;

    CellPhone1(std::string number){
        _number = number;
    }

    void update()
 {
     std::cout << "BUZZZZZZZ - CellPhone #" << _number << " your order is ready " << endl;
}
};

} // namespace Observer
} //

#endif

вот главный ()

#include "Starbuzz.h"
#include "Starbuzz2.h"
#include "Subject.h"

#include "TheOrder.h"
#include "CellPhone2.h"
#include "CellPhone3.h"
#include "CellPhone1.h"

using namespace CoffeeHouse::Decorator;
using namespace CoffeeHouse::Observers;


int main( int argc, char* argv[] ) 
{


Beverage* beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
std::cout << beverage3->getDescription() 
    << " $" 
    << beverage3->cost() 
    << std::endl;

delete beverage3;
delete beverage2;
//delete beverage;



TheOrder* orders = new TheOrder();
CellPhone1* obj = new CellPhone1("1");
orders->registerObserver(obj);
orders->notifyObservers();

    Beverage* beverage6 = new DarkRoast();
orders->NewOrder(new Mocha(new Soy(new Whip((beverage6)))));


return 0;

}

вот класс заказа

#ifndef _ORDER_
#define _ORDER_
#include <iostream>
#include "Beverage.h"

namespace CoffeeHouse {
namespace Decorator {

class Order  {


     Beverage* _beverage;
public: 
    Order(Beverage* beverage)
    {
        _beverage = beverage;
    }




};
}
}
#endif

Итак, теперь мне просто нужно сделать обновление.Что мне нужно передать в update ()?

Я хотел бы передать заказ в обновлении, чтобы мобильный телефон мог отображать заказ.Если попытаться перейти в класс заказа, я должен включить «theorder.h», и тогда я получу миллиард ошибок.

1 Ответ

0 голосов
/ 24 января 2011

Вот несколько комментариев, которые помогут сделать исходный код более читабельным:

1.) Вам не нужно явно объявлять «спецификатор доступа» (публичный / защищенный / приватный) для каждого метода / атрибута.По умолчанию класс имеет спецификатор «private», и он будет применяться несколько раз, пока не встретится другое объявление.

2.) Если фрагмент кода принадлежит конкретному исходному файлу, сообщите нам имя файла вместо того, чтобы угадывать его.

3.) Старайтесь избегать косвенного включения (так как в зависимый заголовок включен другой файл).В вашем текущем проекте все ваши классы зависят от "Starbuzz.h", и нам трудно интерпретировать порядок включения вручную.Вы также можете узнать больше о Форвардной декларации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...