C++ Observer模式

class Subject;
class Observer{
public:
    virtual ~Observer();
    virtual void Update(Subject* theChangedSubject) = 0;
protected:
    Observer();
};

class Subject{
public:
    virtual ~Subject();
    virtual void Attach(Observer*);
    virtual void Detach(Observer*);
    virtual void Notify();
protected:
    Subject();
private:
    List<Observer*> *_observers;
};

void Subject::Attach(Observer* o)
{
    _observers->Append(o);
}

void Subject::Detach(Observer* o)
{
    _observers->Remove(o);
}

void Subject::Notify()
{
    ListIterator<Observer*> i(_observers);
    for(i.First(); !i.IsDone(); i.Next())
    {
        i.CurrentItem()->Update(this);
    }

}

ClockTimer 是一个用于储存和维护一天时间得具体目标。它每秒通知一次它的观察着

class ClockTimer : public Subject{
public:
    ClockTimer();
    virtual int GetHour();
    virtual int GetMinute();
    virtual int GetSecond();
    void Tick();
};

void ClockTimer::Tick(){
    Notify();
}

定义一个DigitalClock类来显示时间

class DigitalClock: public Widget, public Observer{
public:
    DigitalClock(ClockTimer*);
    virtual ~DigitalClock();
    //overrides
    virtual void Update(Subject*);
    //overrides
    virtual void Draw();
private:
    ClockTimer* _subject;
}

DigitalClock::DigitalClock(Clocktimer* s)
{
    _subject = s;
    _subject->Attath(this);
}

DigitalClock::~DigitalClock()
{
    _subject->Detach(this);
}

void DigitalClock::Update(Subject* theChangedSubject)
{
    if(theChangedSubject == _subject)
        Draw();
}
void DigitalClock::Draw()
{
}

一个AnalogClock 可用相同的方法定义。

class AnalogClock: public Widget, public Observer{
public:
    AnalogClock(ClockTimer*);
    virtual void Update(Subject*);
    virtual void Draw();
///....
};

ClockTimer* timer = new ClockTimer;
AnalogClock* analogClock = new AnalogClock(timer);
DigitalClock* digitalClock = new DigitalClock(timer);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下是一个使用观察者(Observer设计模式的示例代码(C++): ```cpp #include <iostream> #include <vector> // 观察者接口 class Observer { public: virtual void update(const std::string& message) = 0; }; // 具体观察者A class ConcreteObserverA : public Observer { public: void update(const std::string& message) override { std::cout << "具体观察者A收到消息:" << message << std::endl; } }; // 具体观察者B class ConcreteObserverB : public Observer { public: void update(const std::string& message) override { std::cout << "具体观察者B收到消息:" << message << std::endl; } }; // 被观察者(主题)类 class Subject { private: std::vector<Observer*> observers; std::string message; public: void attach(Observer* observer) { observers.push_back(observer); } void detach(Observer* observer) { for (auto it = observers.begin(); it != observers.end(); ++it) { if (*it == observer) { observers.erase(it); break; } } } void notify() { for (auto observer : observers) { observer->update(message); } } void setMessage(const std::string& newMessage) { message = newMessage; notify(); } }; // 客户端代码 int main() { // 创建具体观察者对象 Observer* observerA = new ConcreteObserverA(); Observer* observerB = new ConcreteObserverB(); // 创建被观察者对象 Subject subject; // 注册观察者 subject.attach(observerA); subject.attach(observerB); // 设置消息并通知观察者 subject.setMessage("Hello World!"); // 取消注册观察者B subject.detach(observerB); // 设置新消息并通知观察者 subject.setMessage("Goodbye!"); delete observerA; delete observerB; return 0; } ``` 在上述示例代码中,我们定义了一个观察者接口 `Observer`,并要求具体的观察者类继承并实现该接口。具体的观察者类 `ConcreteObserverA` 和 `ConcreteObserverB` 分别定义了不同的更新行为。 被观察者(主题)类 `Subject` 包含一个观察者列表,并提供了注册、注销和通知观察者的方法。通过调用 `notify()` 方法,被观察者会遍历观察者列表,并调用每个观察者的 `update()` 方法来传递消息。 在客户端代码中,我们创建了具体的观察者对象,并将它们注册到被观察者中。然后,通过设置消息并调用被观察者的 `setMessage()` 方法来通知观察者。在示例中,我们设置了两条消息,并在第二条消息后注销了一个观察者。 运行代码将输出每个观察者收到的消息。 这个示例展示了观察者设计模式的基本结构和使用方式,并在 C++ 中实现了它。通过使用观察者模式,可以实现对象之间的松耦合,当一个对象的状态发生变化时,它的所有观察者都会得到通知并进行相应的处理。记得在程序结束时删除动态分配的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值