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

  1. 观察者模式(也叫做观察者-监听者模式,发布-订阅模式)

主要关注对象的一对多关系,也就是多个对象都依赖于一个对象,当该对象状态改变时,其余对象都能得到对应的通知

如:一组数据(数据对象)->曲线图,柱状图,圆饼图

主题有更改,应该及时通知相应观察者去处理相应的事件

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)

{

_subMapmsgid.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.装饰器模式

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

相关推荐
坚果派·白晓明4 分钟前
鸿蒙 PC 应用集成 libhv 鸿蒙化三方库 —— AtomCode + Skills 驱动的高效集成实践
c语言·c++·ai编程·harmonyos·atomcode
触底反弹20 分钟前
拷个 .exe 到新电脑就跑不起来?你缺的不是文件,是对链接的理解
c++·windows·操作系统
是个西兰花43 分钟前
linux:命名管道与共享内存
linux·运维·服务器·网络·c++
qq_297574671 小时前
设计模式系列文章(基础篇第22篇):访问者模式——分离数据结构与操作,实现灵活扩展
数据结构·设计模式·访问者模式
凡人叶枫1 小时前
Effective C++ 条款08:别让异常逃离析构函数
java·linux·数据库·c++·嵌入式开发
QiLinkOS2 小时前
QiLink开源生态的三维重构:基于时间、空间与社会价值的底层规则创新白皮书
大数据·c++·人工智能·科技·算法·gitee·开源
牛肉在哪里2 小时前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
玖玥拾2 小时前
C/C++ 数据结构(二)双向链表
c语言·数据结构·c++
枕星而眠2 小时前
Linux守护进程完全指南:从原理到实战
linux·运维·服务器·c++·后端
QiLinkOS2 小时前
极客精神与商业思维的融合实践(2)
c语言·c++·人工智能·算法·开源协议