观察者模式

定义:
定义对象间的一种一对多(变化)的的依赖关系,以便当一个对象的状态发生改变是,所有依赖于它的对象都得到通知并自动更新
作用:
1、在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,当一个目标对象的状态发生改变,所有的依赖对象即观察者都将得到通知。如果这样的依赖关系过于紧密,将使软件不能做到适应业务变化。
2、弱化依赖关系,形成一种稳定的依赖关系。从而达到结构的松耦合。
模型:
1、推模型:把具体的内容相当于广播模式推送给目标对象
2、拉模型:目标对象在通知观察者时,只传递少量的信息。如果观察者需要更具体的信息,由观察者主动到目标对象中获取u,相当于是从观察者从目标对象中拉取数据。
UML结构:

在这里插入图片描述

结构代码:
```c++
#include <iostream>
#include <list>

using namespace std;

class Subject;

class Observer
{
 public:
    Observer(){}
    virtual ~Observer(){}
    virtual void update(Subject *subject) = 0;
    virtual void update(string content) = 0;
};

class Subject
{
 public:
    Subject(){}
    virtual ~Subject(){};
    virtual void setContent(string _content) = 0;
    virtual string getContent() = 0;
    virtual string getAbstractContent() = 0;

    //订阅
    void attach(Observer *observer)
    {
        observers.push_back(observer);
    }

    //取消订阅
    void detach(Observer *observer)
    {
        observers.remove(observer);
    }
    
 protected:
    //通知所有订阅者
    void notifyObservers()
    {
        for(Observer *reader : observers)
        {
            reader->update(this);   //拉模型
        }
    }

    //通知所有订阅者
    void notifyObservers(string _content)
    {
        for(Observer *reader : observers)
        {
            reader->update(_content);   //推模型
        }
    }
    
 private:
    list<Observer *> observers;
};


class Reader : public Observer
{
 public:
    Reader(){}
    ~Reader(){}

    void update(Subject *subject)
    {
        cout << m_username << "订阅的消息内容:" << subject->getContent() << endl;
    }

    //推模型(粒度更大)
    void update(string _content)
    {
        cout << m_username << "订阅的消息内容:" << _content << endl;
    }

    string getUsername()
    {
        return m_username;
    }

    void setUsername(string _username)
    {
        m_username = _username;
    }
 private:
    string m_username;
};


class Push : public Subject
{
 public:
    Push(){}
    ~Push(){}
    
    void setContent(string _content)
    {
        m_content = _content;
        notifyObservers();
    }

    string getContent()
    {
        return m_content;
    }

    string getAbstractContent()
    {
        return "push information!";
    }

  private:
    string m_content;
};
```
观察者扩展:
设置责任链模式,根据等级进行发布通知
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值