listener设计模式

在C++中实现Listener(或称为Observer)模式通常涉及多个类,这些类分布在不同的文件中以管理代码的复杂性和提高可维护性。Listener模式是一种行为设计模式,它允许对象(subject)在状态变化时通知(notify)其他对象(observers)。以下是一个简单的实现示例,包括三个主要部分:Subject(主题)、Listener(监听器)接口和具体的Listener实现。
1. 定义Listener接口
首先,我们定义一个Listener接口,它包含了一个更新方法,该方法将由Subject在状态变化时调用。

Listener.h

#ifndef LISTENER_H
#define LISTENER_H

class Listener {
public:
    virtual ~Listener() {}
    virtual void update(const std::string& message) = 0;
};

#endif // LISTENER_H

2. 实现具体的Listener
然后,我们实现一个或多个具体的Listener类。

ConcreteListener.h

#ifndef CONCRETELISTENER_H
#define CONCRETELISTENER_H

#include "Listener.h"
#include <iostream>

class ConcreteListener : public Listener {
public:
    void update(const std::string& message) override {
        std::cout << "Received update: " << message << std::endl;
    }
};

#endif // CONCRETELISTENER_H

3. 定义Subject类
Subject类维护了一个监听器列表,并提供注册监听器和通知监听器的方法。
Subject.h

#ifndef SUBJECT_H
#define SUBJECT_H

#include <vector>
#include <memory>
#include "Listener.h"

class Subject {
private:
    std::vector<std::shared_ptr<Listener>> listeners;

public:
    void registerListener(std::shared_ptr<Listener> listener) {
        listeners.push_back(listener);
    }

    void removeListener(std::shared_ptr<Listener> listener) {
        listeners.erase(std::remove(listeners.begin(), listeners.end(), listener), listeners.end());
    }

    void notifyListeners(const std::string& message) {
        for (auto& listener : listeners) {
            listener->update(message);
        }
    }
};

#endif // SUBJECT_H

4. 使用示例
最后,我们可以在主函数或其他适当的位置创建Subject和Listener对象,并演示如何使用它们。
main.cpp

#include "Subject.h"
#include "ConcreteListener.h"
#include <memory>

int main() {
    Subject subject;

    auto listener1 = std::make_shared<ConcreteListener>();
    auto listener2 = std::make_shared<ConcreteListener>();

    subject.registerListener(listener1);
    subject.registerListener(listener2);

    subject.notifyListeners("Hello, Listeners!");

    return 0;
}

编译和运行
确保你的开发环境配置正确,并且所有头文件都已正确包含。你可以使用g++或任何其他C++编译器来编译这些文件。

g++ -o observer_example main.cpp ConcreteListener.cpp Subject.cpp
./observer_example

以上示例展示了如何在C++中使用多个文件来实现Listener模式。你可以根据具体需求添加更多的Listener实现或修改Subject类来支持更复杂的状态变化逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值