禅城区网站建设,电脑买编程代码做网站,wordpress如何添加分类,动感网站模板核心思想
观察者模式是一种行为型设计模式#xff0c;定义了对象之间的一对多依赖关系。当一个对象#xff08;称为Subject#xff0c;主题#xff09;的状态发生改变时#xff0c;所有依赖于它的对象#xff08;称为Observer#xff0c;观察者#xff09;都会自动收到…核心思想
观察者模式是一种行为型设计模式定义了对象之间的一对多依赖关系。当一个对象称为Subject主题的状态发生改变时所有依赖于它的对象称为Observer观察者都会自动收到通知并更新。
**Subject**维护观察者列表提供注册、移除观察者的方法以及通知观察者的功能。 **Observer**定义一个更新接口用于在Subject状态改变时接收通知。 观察者模式的核心是解耦Subject和Observer之间没有直接依赖Subject只需通知Observer而不需要知道Observer的具体实现。
使用场景
事件驱动系统如GUI框架中按钮点击事件通知多个监听器。 发布-订阅模型如消息队列、事件总线。 数据与UI同步如MVC架构中Model变化时自动更新View。 监控系统如系统状态变化时通知多个监控服务。 游戏开发如角色状态变化时通知多个UI组件或AI系统。
解决的问题
紧耦合问题
在传统设计中Subject需要直接调用Observer的方法导致两者紧耦合。观察者模式通过引入Observer接口使Subject和Observer解耦。
动态更新问题
当Subject状态变化时需要手动调用所有依赖对象的更新方法。观察者模式通过notify方法自动通知所有Observer。
可扩展性问题
新增Observer时需要修改Subject的代码。观察者模式允许动态注册和移除Observer无需修改Subject。
示例代码
#include iostream
#include list
#include memory
#include mutex// 观察者接口
class Observer {
public:virtual ~Observer() default;virtual void update(const std::string message) 0;
};// 主题基类
class Subject {
protected:std::liststd::weak_ptrObserver observers; // 使用weak_ptr防止循环引用std::mutex mutex;//多线程环境下需要使用
public:// 添加观察者使用智能指针管理void attach(const std::shared_ptrObserver observer){std::lock_guardstd::mutex lock(mutex);observers.push_back(observer);}// 移除观察者void detach(const std::shared_ptrObserver observer){std::lock_guardstd::mutex lock(mutex);auto it observers.begin();while(it ! observers.end()){//std::weak_ptr的lock()方法返回对应的std::shared_ptrif(observer it-lock()){it observers.erase(it);continue;}it;}}// 通知所有观察者void notify(const std::string message){std::lock_guardstd::mutex lock(mutex);auto it observers.begin();while (it ! observers.end()){//检查观察者是否有效因为观察者有可能在别的地方被清理了if (!it-expired()){//std::weak_ptr的lock()方法返回对应的std::shared_ptr只能通过std::shared_ptr操作管理的对象it-lock()-update(message);it;}else{it observers.erase(it); // 自动清理失效的观察者}}}
};// 具体主题新闻发布器
class NewsPublisher : public Subject {
public:void publishNews(const std::string news){std::cout publishNews: news std::endl;notify(news); // 通知所有观察者}
};// 具体观察者1邮件订阅者
class EmailSubscriber : public Observer
{
public:~EmailSubscriber(){std::cout EmailSubscriber destroyed std::endl;}void update(const std::string message) override{std::cout EmailSubscriber recive: message std::endl;}
};// 具体观察者2短信订阅者
class SMSSubscriber : public Observer
{
public:~SMSSubscriber(){std::cout SMSSubscriber destroyed std::endl;}void update(const std::string message) override{std::cout SMSSubscriber recive: message std::endl;}
};int main() {// 创建主题NewsPublisher publisher;// 创建观察者使用智能指针auto emailSubscriber std::make_sharedEmailSubscriber();auto smsSubscriber std::make_sharedSMSSubscriber();// 注册观察者publisher.attach(emailSubscriber);publisher.attach(smsSubscriber);// 发布新闻通知所有观察者publisher.publishNews(C20 has been published!);// 移除一个观察者publisher.detach(smsSubscriber);publisher.publishNews(designe patten meeting);// 测试观察者自动清理{auto tempSubscriber std::make_sharedEmailSubscriber();publisher.attach(tempSubscriber);publisher.publishNews(temporary news);} // tempSubscriber离开作用域自动解除注册publisher.publishNews(only subscriber recived this message.);return 0;
}
运行输出
publishNews: C20 has been published!
EmailSubscriber recive: C20 has been published!
SMSSubscriber recive: C20 has been published!
publishNews: designe patten meeting
EmailSubscriber recive: designe patten meeting
publishNews: temporary news
EmailSubscriber recive: temporary news
EmailSubscriber recive: temporary news
EmailSubscriber destroyed
publishNews: only subscriber recived this message.
EmailSubscriber recive: only subscriber recived this message.
SMSSubscriber destroyed
EmailSubscriber destroyed