设计模式,如单例模式、观察者模式在什么场景下使用

news/2025/3/22 0:23:55/

以下是单例模式和观察者模式的介绍及应用场景:

 

单例模式

 

- 定义:保证一个类仅有一个实例,并提供一个全局访问点。

 

- 实现方式:私有化构造函数,防止外部实例化;提供一个静态成员函数来获取唯一实例。

 

- 应用场景:在系统中,当某个资源需要全局唯一访问,如数据库连接池、文件系统操作对象、系统配置对象等,可使用单例模式。以数据库连接池为例,多个模块可能都需要访问数据库,使用单例模式可确保所有模块使用同一个连接池,避免资源浪费和连接管理的混乱。

 

观察者模式

 

- 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

 

- 实现方式:通常有主题(被观察对象)和观察者两个角色。主题维护一个观察者列表,当主题状态改变时,遍历列表通知所有观察者。

 

- 应用场景:广泛应用于事件处理系统、界面更新、消息通知等场景。如在图形界面应用中,当用户操作界面元素(如按钮点击)时,多个相关的组件(如文本框、菜单等)可能需要根据这个操作进行更新,就可以使用观察者模式。当按钮状态改变(被点击)时,作为主题通知所有注册的观察者(相关组件)进行相应的更新操作。以下是用C++分别实现单例模式和观察者模式的代码示例:

 

单例模式(懒汉式单例)

 

cpp

#include <iostream>

#include <mutex>

using namespace std;

 

class Singleton {

private:

    static Singleton* instance;

    static mutex mtx;

    Singleton() {}

public:

    static Singleton* getInstance() {

        if (instance == nullptr) {

            lock_guard<mutex> lock(mtx);

            if (instance == nullptr) {

                instance = new Singleton();

            }

        }

        return instance;

    }

 

    void showMessage() {

        cout << "This is a singleton instance." << endl;

    }

};

 

Singleton* Singleton::instance = nullptr;

mutex Singleton::mtx;

 

 

单例模式使用示例

 

cpp

int main() {

    Singleton* s1 = Singleton::getInstance();

    Singleton* s2 = Singleton::getInstance();

 

    if (s1 == s2) {

        cout << "Both are the same instance." << endl;

    }

 

    s1->showMessage();

    return 0;

}

 

 

观察者模式

 

cpp

#include <iostream>

#include <vector>

using namespace std;

 

// 观察者接口

class Observer {

public:

    virtual void update() = 0;

    virtual ~Observer() {}

};

 

// 主题接口

class Subject {

public:

    virtual void attach(Observer* observer) = 0;

    virtual void detach(Observer* observer) = 0;

    virtual void notify() = 0;

    virtual ~Subject() {}

};

 

// 具体主题

class ConcreteSubject : public Subject {

private:

    vector<Observer*> observers;

    int state;

public:

    void attach(Observer* observer) override {

        observers.push_back(observer);

    }

 

    void detach(Observer* observer) override {

        for (auto it = observers.begin(); it != observers.end(); ++it) {

            if (*it == observer) {

                observers.erase(it);

                break;

            }

        }

    }

 

    void notify() override {

        for (Observer* observer : observers) {

            observer->update();

        }

    }

 

    int getState() const {

        return state;

    }

 

    void setState(int newState) {

        state = newState;

        notify();

    }

};

 

// 具体观察者

class ConcreteObserver : public Observer {

private:

    string name;

    Subject* subject;

public:

    ConcreteObserver(const string& n, Subject* sub) : name(n), subject(sub) {}

 

    void update() override {

        cout << "Observer " << name << " updated. New state: " << subject->getState() << endl;

    }

};

 

 

观察者模式使用示例

 

cpp

int main() {

    ConcreteSubject subject;

    ConcreteObserver observer1("Observer1", &subject);

    ConcreteObserver observer2("Observer2", &subject);

 

    subject.attach(&observer1);

    subject.attach(&observer2);

 

    subject.setState(10);

 

    subject.detach(&observer1);

    subject.setState(20);

 

    return 0;

}

 

 

上述代码中,单例模式实现了懒汉式的单例,通过双重检查锁定确保线程安全地获取唯一实例。观察者模式定义了主题和观察者的接口,具体主题维护观察者列表并在状态变化时通知观察者,具体观察者实现了更新方法以响应主题的变化。


http://www.ppmy.cn/news/1581016.html

相关文章

前端解决跨域的几种方案

以下是前端解决跨域问题的 7 种主流方案&#xff0c;根据应用场景和实现难度排序&#xff0c;附详细实现示例&#xff1a; 一、开发环境解决方案 1. Webpack DevServer 代理&#xff08;推荐&#xff09; // vue.config.js / webpack.config.js module.exports {devServer: …

Qt-QChart实现折线图

一、介绍场景 动态查看数据变化&#xff0c;或者了解数据发展趋势&#xff0c;让数据可以形象直观展现出来&#xff0c;这里推荐使用折线图的方式展现&#xff0c;本文抛砖引玉&#xff0c;简单实现一个实例&#xff0c;效果图如下&#xff1a; 二、实现步骤 1、charts组件 …

解决qt中自定插件加载失败,不显示问题。

这个问题断断续续搞了一天多&#xff0c;主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器&#xff08;64 位&#xff09; 编译的。…

2024年河南省职业院校 技能大赛高职组 “大数据分析与应用” 赛项任务书(四)

2024 年河南省职业院校 技能大赛高职组 “大数据分析与应用” 赛项任务书&#xff08;四&#xff09;&#xff09; 背景描述&#xff1a;任务一&#xff1a;Hadoop 完全分布式安装配置&#xff08;25 分&#xff09;任务二&#xff1a;离线数据处理&#xff08;25 分&#xff0…

Dify + Agent实现自然语言查询Mysql数据库并分析

问题是&#xff0c;我配置完AGENT中的提示词、变量、知识库、工具后&#xff0c;比如我输入“查询用户信息”&#xff0c;按照 【知识库】中的文件信息&#xff0c;生成的sql应该是 “select * from sys_user”等sql,但现在情况是&#xff0c;生成的sql中的表信息&#xff0…

网络安全常识科普(百问百答)

汪乙己一到店&#xff0c;所有喝酒的人便都看着他笑&#xff0c;有的叫道&#xff0c;“汪乙己&#xff0c;你又监控员工隐私了&#xff01;”他不回答&#xff0c;对柜里说&#xff0c;“来两个fofa。”便排出三个比特币。他们又故意的高声嚷道&#xff0c;“你一定又在电报群…

《基于Spring Boot+Vue的智慧养老系统的设计与实现》开题报告

个人主页:@大数据蟒行探索者 一、研究背景及国内外研究现状 1.研究背景 根据1982年老龄问题世界大会联合国制定的标准,如果一个国家中超过65岁的老人占全国总人口的7%以上,或者超过60岁的老人占全国总人口的10%以上,那么这个国家将被定义为“老龄化社会”[1]。 随着国…

PHP转GO Go语言环境搭建(Day1) 常见问题及解决方案指南

Go语言环境搭建(Day1)整理的 常见问题及解决方案指南: Go环境搭建问题排查手册 一、安装阶段问题 问题现象原因分析解决方案安装包下载失败网络问题或官网访问慢使用国内镜像下载:- Go中文网提示"Access Denied"Windows系统权限不足1. 右键安装包选择"以管理…