C++设计模式--Observer观察者模式

本文介绍了Observer模式,它用于建立对象间的松耦合依赖关系,当一个对象状态改变时,所有依赖的对象都会得到通知并自动更新。通过示例代码展示了如何将具体的依赖(如进度条)替换为抽象接口,实现通知的通用性,从而降低目标对象与观察者之间的耦合。Observer模式常用于事件驱动的UI框架和MVC模式。
摘要由CSDN通过智能技术生成


1、动机

在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”–一个对象(目标对象)的状态发生变化,所有依赖对象(观察者对象)都将得到通知。如果这样的依赖过于紧密,将使软件不能很好的抵御变化。

使用面向对象技术,可以将这种依赖关系弱化,并形成一种文档的依赖关系。从而实现软件体系结构中的松耦合。


2、模式定义

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

实例源码:红色模块为改良前,蓝色代码为改良后

class IProgress{
public:
  virtual void DoProgress(float value) = 0;
  virtual ~IProgress(){}
};

class FileSplitter
{
  string m_filePath;
  int m_fileNumber;

  //具体通知,会带来实现细节上困扰,比如要在label上显示百分比,或者在窗口上打印进度点
  //ProgressBar* m_progressbar;

  IProgress* m_iprogress; //抽象类通知

public:
  FileSplitter(const string& filePath, int fileNumber, /* ProgressBar* progressbar*/ IProgress* iprogress):
  m_filePath(filePath),
  m_fileNumber(fileNumber),
  /* m_progressbar(progressbar */
  m_iprogress(iprogress))
  {
  }

  void split()
  {
  //1. 读物大文件
  //2. 分批次向小文件中写入
  for(int i =0 ; i < m_fileNumber; i++)
  {
     //…
     if(m_progressbar != nullptr)
     {
     float progressValue = m_fileNumber;
     progressValue = (i+1)/progressValue;
     //m_progressbar ->setValue(progressValue); //更新进度条
     m_iprogress->DoProgress(progressValue);
     }
    }
  }
};

class MainForm : public Form, public IProgress
{
  TextBox* txtFilePath;
  TextBox* txtFileNumber;
  ProgressBar* progressbar; //这里就可以定义为进度条、label或者界面打印

  public:
  void Button_Clicked()
  {
     string filePath = txtFilePath->getText();
     int number = atoi(txtFileNumber->getText().c_str());

     //FileSplitter splitter(filePath, number);
     FileSplitter splitter(filePath, number, this);
     splitter.split();
  }

  virtual void DoProgress(float value)
  {
     progressbar->setValue(value);
  }

};


3、要点总结

(1)使用面向对象的抽象,Observer模式使得我们可以独立的改变目标与观察者,从而使二者之间的依赖关系达到松耦合。

(2) 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。

(3)观察者自己决定是否需要订阅通知,目标对象对此一无所知。

(4)Observer模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值