C++八股--5--设计模式--适配器模式,代理模式,观察者模式


3. 观察者模式(也叫做观察者-监听者模式,发布-订阅模式)
主要关注对象的一对多关系,也就是多个对象都依赖于一个对象,当该对象状态改变时,其余对象都能得到对应的通知
如:一组数据(数据对象)->曲线图,柱状图,圆饼图
主题有更改,应该及时通知相应观察者去处理相应的事件

class Observer
{
public:
    //处理消息接口
    virtual void handle(int msgid) = 0;
};

class Observer1
{
public:
    //处理消息接口
    void handle(int msgid)
    {
        switch(msgid)
        {
        case 1:
            cout<<"get 1"<<endl;
            break;
        case 2:
            cout<<"get 2"<<endl;
            break;
        default:
            cout<<"get error"<<endl;
            break;
        }
    }
};

class Observer2
{
public:
    //处理消息接口
    void handle(int msgid)
    {
        switch(msgid)
        {
        case 2:
            cout<<"get 2"<<endl;
            break;
        default:
            cout<<"get error"<<endl;
            break;
        }
    }
};

class Subject
{
public:    
    //添加对应观察者
    void addObserver(Observer* obser,int msgid)
    {
        _subMap[msgid].push_back(obser);
    }
    //通知观察者
    void dispatch(int msg)
    {
        auto it = _subMap.find(msgid);
        if(it != _subMap.end())
        {
            for(Observer *pObser:it->second)
            {
                pObser->handle(msgid):
            }
        }
    }
private:
    //前面的int代表消息id,后面表示对其感兴趣的观察者列表
    unordered_map<int,list<Observer*>> _subMap;
};

观察者模式实际上就是创建一个主题类,然后当有消息来到的时候,主题负责通知各个观察者,也就是函数调用


4.代理Proxy模式:通过代理类来控制实际对象的访问权限
客户  助理Proxy  老板:委托类

//下面为一个案例,将视频分为Vip和免费,不同身份可以获取的视频不同
class VideoSite
{
    virtual void freeMovie() = 0;//免费电影
    virtual void vipMovie() = 0;//vip电影
};
//这个是我们的网站,实现看vip电影和free电影,也就是我们的委托类
class FixBugVideoSite: public Video Site
{
public:
    virtual void freeMovie()
    {
        cout<<"see free"<<endl;
    }
    virtual void vipMovie()
    {
        cout<<"see vip"<<endl;
    }
};

//下面就是我们免费电影的代理
class FreeVideoSiteProxy : public VideoSite
{
public:
    FreeVideoSiteProxy()
    {
        pVideo = new FixBugVideoSite();
    }
    ~ FreeVideoSiteProxy()
    {
        delete pVideo;
    }
    
    virtual void freeMovie() 
    {
        pVideo->freeMovie();//通过代理对象的freeMovie,来访问真正委托类对象的freeMovie
    }
    virtual void vipMovie() 
    {
        cout<<"你没充钱,不让你访问";
    }


private:
    VideoSite *pVideo;
};

实际上上述代理模式的原理在于创建一个代理类,在代理类中定义委托类指针,不同的代理类指行不同的函数
基类指针指向代理类对象,都使用基类指针保证安全

5.适配器模式
让不兼容的接口可以一起工作
示例
电脑 -> 投影 ->投影仪 
VGA HDMI Typec 有这三种接口
如果VGA的电脑,投影仪也是VGA,那么就不需要转换
class VGA
{
public:
    virtual void play() = 0;
    string getType() const{return "VGA";}
};

//这个就是支持VGA接口的投影仪
class TV01 : public VGA
{
public:
    void play()
    {
        cout<<"VGA接口"<<endl;
    }
};

//这个就是支持VGA接口的电脑
class Computer : public VGA
{
public:
    void playVedio(VGA *pVGA)
    {
        pVGA->play();
    }
};
//这时候有一批新的投影仪,只支持HDMI接口
class HDMI
{
public:
    virtual void play() = 0;
};
class TV02 : public HDMI
{
public:
    void play()
    {
        cout<<"HDMI接口"<<endl;
    }
};
此时你使用电脑连接新的投影仪,无法连接

换一个电脑:代码重构
但是实际上很难去重构
方法2:买一个转换头,转换信号:也就是适配器类

class VGAtoHDMI : public VGA
{
public:
    VGAtoHDMI(HDMI *p):phdmi(p){};
    void play()//该方法相当于转换头,做信号转换的
    {
        phdmi->play():
    }
private:
    HDMI *phdmi;
};

这个适配器模式实际上就是重写了老接口的函数,转为新接口的函数,就是更换组件


6.装饰器模式
和代理模式非常接近,主要是增加现有类的功能
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS arcpy代码工具——根据属性结构表创建shape图层

系列文章目录 ArcGIS arcpy代码工具——关于工具使用的软件环境说明 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS…

机器视觉开发-打开摄像头

以下是使用Python和OpenCV打开摄像头的最简单实现&#xff1a; import cv2# 打开默认摄像头&#xff08;通常是0&#xff09; cap cv2.VideoCapture(0)# 检查摄像头是否成功打开 if not cap.isOpened():print("无法打开摄像头")exit()print("摄像头已打开 - 按…

(Go Gin)Gin学习笔记(三)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法

1. 数据解析和绑定 bind或bindXXX函数&#xff08;后文中我们统一都叫bind函数&#xff09;的作用就是将请求体中的参数值绑定到对应的结构体上&#xff0c;以方便后续业务逻辑的处理 1.1 JSON数据解析和绑定 客户端传参&#xff0c;后端接收并解析到结构体 package mainim…

Kubernetes(k8s)学习笔记(四)--入门基本操作

本文通过kubernetes部署tomcat集群&#xff0c;来学习和掌握kubernetes的一些入门基本操作 前提条件 1.各个节点处于Ready状态&#xff1b; 2.配置好docker镜像库(否则会出现ImagePullBackOff等一些问题)&#xff1b; 3.网络配置正常(否则即使应用发布没问题&#xff0c;浏…

【大模型面试每日一题】Day 7:为什么大模型训练选择 Adam 而非 SGD?Adam 的关键改进是什么?

【大模型面试每日一题】Day 7&#xff1a;为什么大模型训练选择 Adam 而非 SGD&#xff1f;Adam 的关键改进是什么&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官&#xff1a;为什么大模型训练选择 Adam 而非 SGD&#xff1f;Adam 的关键改进是什么…

轻量级在线Excel预览工具

轻量级在线Excel预览工具 简介 在日常工作中&#xff0c;我们经常需要快速查看Excel文件的内容&#xff0c;但不一定总是需要打开完整的Excel软件。为了解决这个问题&#xff0c;我开发了一个轻量级的在线Excel预览工具&#xff0c;让您可以通过浏览器快速查看Excel文件内容。…

[Vue]props解耦传参

在 Vue 中&#xff0c;通过 props 传递路由参数&#xff08;即 props 解耦&#xff09;是一种将组件与路由参数解耦的推荐方式。这种方法能显著提升组件的独立性、复用性和可维护性。以下是详细解释&#xff1a; 一、什么是 props 解耦&#xff1f; props 解耦是指&#xff1a…

Trae 使用心得:从新手到上手

Trae 使用心得&#xff1a;从新手到上手 最近&#xff0c;我开始试用 Trae&#xff0c;一款新兴的 AI 开发工具。在使用过程中&#xff0c;我发现它与我之前用过的 Cursor 有些不同&#xff0c;也带来了一些新的体验。 初体验&#xff1a;操作的便利性 一开始&#xff0c;我…

游戏引擎学习第256天:XBox 控制器卡顿和修复 GL Blit 伽玛问题

回顾并为今天定下基调 今天的主要任务是让我们的性能分析工具正常工作&#xff0c;因为昨天已经完成了结构性工作。现在&#xff0c;剩下的工作大部分应该是调试和美化。性能分析工具现在应该已经基本可用了。昨天我们在这个方面取得了很大的进展。 接下来&#xff0c;我们将…

PVD中断检测掉电

文章目录 概述配置掉电擦写注意 概述 STM32 PVD功能具体可以检测到上电、掉电瞬间&#xff0c;其处理方式有中断响应及事件响应。掉电设置为上升沿触发&#xff0c;上电为下降沿触发 配置 1.开启PVD中断并设置其优先级 2.配置响应中断或事件的阈值电压 3.配置响应模式 生成…

快速掌握--cursor

Cursor - The AI Code Editor 官网下载安装 详细教程&#xff1a;cursor 下载安装使用&#xff08;保姆教程&#xff09;_cursor下载-CSDN博客 不知道为啥&#xff0c;第一次给我用的是繁体回答 然后改了一下询问方式 codebase就是告诉ai可以从整个项目中找答案&#xff0…

1993年地级市民国铁路开通数据(地级市工具变量)

1993年地级市民国铁路开通数据&#xff08;地级市工具变量&#xff09; 1、时间&#xff1a;1933年 2、指标&#xff1a;是否开通铁路 3、来源&#xff1a;《Z国铁道便览》 4、方法说明&#xff1a;参考田坤&#xff08;2023&#xff09;参考章元&#xff08;2008&#xff…

AI优化SEO关键词实践路径

内容概要 随着人工智能技术深度渗透数字营销领域&#xff0c;SEO关键词优化正经历从人工经验驱动向算法智能决策的跃迁。本文聚焦AI技术在SEO关键词全生命周期管理中的应用框架&#xff0c;系统阐述智能算法如何通过海量数据挖掘潜在搜索需求、解析用户意图的语义关联性&#…

论微服务架构及其应用

试题四 论微服务架构及其应用 微服务提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0c;为用户提供最终价值。每个服务运行在其独立的进程中&#xff0c;服务与服务间采用轻量级的通信机制互相沟通。在微服务架构中&#xff0c;每个服务…

基于SpringBoot+Vue实现的电影推荐平台功能三

一、前言介绍&#xff1a; 1.1 项目摘要 2023年全球流媒体用户突破15亿&#xff0c;用户面临海量内容选择困难&#xff0c;传统推荐方式存在信息过载、推荐精准度低等问题。传统推荐系统存在响应延迟高&#xff08;平均>2s&#xff09;。随着互联网的快速发展&#xff0c;…

ARM 算数指令

加法 ADD 减法 SUB 取负 NEG 比较 CMP 乘法 MUL 移位 LSL、LSR、ASL、ASR、ROL、ROR加法和减法 绝大多数微处理器都实现了带进位的加法指令&#xff0c;能够将两个操作数和条件码寄存器中的进位位加到一起。这条指令会使字长大于计算机固有字长的链接运算更加方便。 说明了如何…

JAVA---集合ArrayList

集合 1. 自动扩容 &#xff0c;集合长度可变 2. 只可以存引用数据类型&#xff0c;如果要存基本数据类型&#xff0c;需要将其转换成对应的包装类 ArrayList 定义在 java.util 下的&#xff0c;实现了 List 接口。ArrayList 内部以动态数组的形式存储元素&#xff0c;这意…

Scrapy框架之【settings.py文件】详解

settings.py 文件的主要作用是对 Scrapy 项目的全局设置进行集中管理。借助修改这个文件中的配置项&#xff0c;你可以对爬虫的行为、性能、数据处理等方面进行灵活调整&#xff0c;而无需修改爬虫代码。 ①默认英文注释settings.py # Scrapy settings for douban project # …

Java变量学习笔记

Java变量 -为什么需要变量&#xff1f; 一个程序就是一个世界 变量是程序的基本组成单位 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位&#xff0c;比如: //变量有三个基本要素(类型名称值) class Test{public static void main(String [largs){int a1;…

数据结构*队列

队列 什么是队列 是一种线性的数据结构&#xff0c;和栈不同&#xff0c;队列遵循“先进先出”的原则。如下图所示&#xff1a; 在集合框架中我们可以看到LinkedList类继承了Queue类&#xff08;队列&#xff09;。 普通队列&#xff08;Queue&#xff09; Queue中的方法 …