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

ops/2025/3/26 2:14:59/

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

 

单例模式

 

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

 

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

 

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

 

观察者模式

 

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

 

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

 

- 应用场景:广泛应用于事件处理系统、界面更新、消息通知等场景。如在图形界面应用中,当用户操作界面元素(如按钮点击)时,多个相关的组件(如文本框、菜单等)可能需要根据这个操作进行更新,就可以使用观察者模式。当按钮状态改变(被点击)时,作为主题通知所有注册的观察者(相关组件)进行相应的更新操作。以下是用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/ops/167746.html

相关文章

STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构

目录 一、嵌入式系统的概念 二、通用计算机系统与嵌入式系统的比较 用途 硬件 软件 性能与功耗 开发与维护 三、嵌入式系统与物联网的关系 四、物联网的三层架构 1. 感知层&#xff08;Perception Layer&#xff09; 2. 网络层&#xff08;Network Layer&#xff09; …

针对耳鸣患者推荐的一些菜谱和食材

耳鸣患者应当关注饮食的均衡性&#xff0c;因为许多食物和营养素都可能对改善听力问题产生积极影响。以下是针对耳鸣患者推荐的一些菜谱和食材&#xff0c;以供参考。 一、蔬菜类 1. 菠菜&#xff1a;菠菜富含铁元素&#xff0c;对于补血益气有良好效果&#xff0c;能改善因贫…

Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用

散点图:数据分析的利器 在数据分析领域,散点图是一种直观且强大的可视化工具,广泛应用于揭示变量间的相关性以及识别数据集中的异常值。本文将深入探讨散点图的这两种关键功能,并结合实际案例与Python代码示例,带您全面了解散点图的应用。 一、散点图如何展示变量间的相…

Spring Boot Actuator 自定义健康检查(附Demo)

目录 前言1. Demo2. 拓展 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF Spring Boot 的 actuator 提供了应用监控的功能&#xff0c;其中健康检查&#xff08;Health Check&#xff09;是一个重要的部分&…

游戏引擎学习第169天

回顾和今天的计划 接下来进行编译&#xff0c;并设置编译目录&#xff0c;以便查看昨天的工作成果。可以看到&#xff0c;我们的界面上已经有了一些字体显示的内容。现在&#xff0c;可能是一个合适的时机关闭背景音乐&#xff0c;目前不需要音乐&#xff0c;相信大多数人也不…

基于java的ssm+JSP+MYSQL的母婴用品网站(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能模块&#xff1a; 主页 个人中心 用户管理 商品分类管理 商品信息管理 留言板管理 成长交流 系统管理 订单管理 留言管理 用户功能模块&#xff1a; 主页 个人中心 我的收藏管理 订单管理 前台首页功能模块&#xff1a; 首页 商品信息 论…

ICRA 2025 面向移动抓取的全身控制新范式——让机器人在移动与操控之间动态平衡

机器人学领域&#xff0c;移动抓取&#xff08;Mobile Manipulation&#xff09;是实现机器人在复杂环境中自主操作的关键技术。然而&#xff0c;当前主流的方法往往将移动底盘和机械臂的规划分开处理&#xff0c;这种割裂的方式导致机器人无法高效协调运动与抓取&#xff0c;进…

21、web前端开发之html5(二)

五. Canvas和SVG 在网页开发中&#xff0c;Canvas和SVG是两种常用的图形绘制技术&#xff0c;各有其特点和适用场景。以下是对这两种技术的详细讲解&#xff0c;帮助你更好地理解它们的区别和使用场景。 1、Canvas 1.1. 概念 Canvas&#xff08;画布&#xff09;是一个HTML元…