• 观察者设计模式,以及简单的代码实现


    1概念:

    观察者设计模式:就用来解决两个不相关对象之间的一对一或一对多的通信模型。他是一种编程套路

    观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。 

    观察者模式(Observer)完美的将观察者和被观察的对象分离开。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

    2..观察者设计模式是来解决什么问题?

    观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

    观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。

    3.观察者设计模式的简易编程套路是什么?

    1.假定两个类,一个为观察者类,一个为被观察者类。

    2.观察者类中,定义一个对某个事件感兴趣的处理函数,一般也叫槽函数。

    3.被观察者类中,定义一个数据结构,用来保存观察者对哪一个事件id(信号)感兴趣,使用数据结构建立信号与对象之间的映射关系。

    4.被观察者类中,定义两个方法函数:

    一个方法为:添加观察者与其感兴趣的事件id(信号)加入到容器之中。

    另一个方法为:信号函数:通知事件函数执行逻辑:首先遍历容器之中,有没有感兴趣的事件ID,如果有,则代表一系列的观察者,对这个事件感兴趣,那么再次遍历观察者列表,让每一个观察者执行相应的槽函数。

    4.简单的代码介绍:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class Base_Recv
    6. {
    7. public:
    8. virtual void show_info(int num)=0;
    9. virtual ~Base_Recv()=default;
    10. };
    11. class Recver:public Base_Recv
    12. {
    13. public:
    14. void show_info(int num) override
    15. {
    16. switch (num) {
    17. case 1:
    18. cout<<"1号信息"<
    19. break;
    20. case 2:
    21. cout<<"2号信息"<
    22. break;
    23. case 3:
    24. cout<<"3号信息"<
    25. break;
    26. }
    27. }
    28. };
    29. class Sender
    30. {
    31. public:
    32. map<int,Base_Recv*> mp;
    33. void add(int num,Base_Recv* p)
    34. {
    35. mp[num]=p;
    36. }
    37. void single(int num)
    38. {
    39. mp[num]->show_info(num);
    40. }
    41. };
    42. int main()
    43. {
    44. Base_Recv* recv1=new Recver;
    45. Base_Recv* recv2=new Recver;
    46. Base_Recv* recv3=new Recver;
    47. Sender sender;
    48. sender.add(1,recv1);
    49. sender.add(2,recv2);
    50. sender.add(3,recv3);
    51. for(;;){
    52. int num1;
    53. cin>> num1;
    54. sender.single(num1);
    55. }
    56. return 0;
    57. }


     

  • 相关阅读:
    保护数据安全:如何免受.kann勒索病毒的影响
    「SpringCloud Alibaba」Sentinel实现熔断与限流
    LeetCode讲解篇之面试题 01.08. 零矩阵
    手撕520页PDF高级文档,成功“挤掉”7年开发架构师,牛逼
    基于JAVA医疗器械销售电子商城计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    《牛客题霸-算法篇》刷题之NC111 最大数
    判断非线性负载是否合格的方法可以从以下几个方面进行考虑:
    Redis源码解读之用RedisAe实现一个简单的HTTP服务器
    Vue异步更新机制、$nextTick实现同步更新
    什么蓝牙耳机好用不贵?好用不贵的蓝牙耳机推荐
  • 原文地址:https://blog.csdn.net/a2998658795/article/details/126148636