在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类来支持更复杂的状态变化逻辑。