Observer和Decorator一起使用c ++ * REVISED *

时间:2011-01-23 23:45:15

标签: c++ design-patterns

我有一个咖啡馆的程序,它将饮料作为装饰/包装......

我也有观察员,我正试图将其与饮料联系起来。因此,当下订单时,通知手机一。我不知道如何进行更新..

如果我通过TheOrder课程我会收到错误!

beverage.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种(浓咖啡,浓汤,黑加仑,脱咖啡因)

#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

这里是main()

#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 :(得分:0)

以下是一些有助于提高源代码可读性的注释:

1。)您不必为每个方法/属性显式声明“访问说明符”(public / protected / private)。默认情况下,类具有“私有”说明符,它将被重复应用,直到遇到另一个声明。

2。)如果代码片段属于特定的源文件,请告诉我们文件名,而不是让我们猜测它。

3.)尽量避免间接包含(如在另一个文件中包含依赖的标题)。在您当前的项目中,您的所有类都依赖于“Starbuzz.h”,我们很难手动解释包含的顺序。您可能还想了解有关前瞻性声明的更多信息。