c++ 设计模式 之 观察者模式

观察者模式  是一种行为型设计 模式

发布-订阅者 模式

一对多  的依赖关系...

github上 这样讲 过Observer

  • 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对 象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。
  • 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。   

模式定义 

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

总结

  • 使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
  • 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。
  • 观察者自己决定是否需要订阅通知,目标对象对此一无所知。
  • Observer模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分。

 

好了,贴出自己写的 一部分代码:

#include <iostream>
#include <list>
#include <string>
#include <algorithm>
//抽象观察者
class Observer{
public:
  virtual void update(std::string message) = 0;
};

//具体 观察者
class Student : public Observer{
public:
  Student(std::string na){
    name = na;
  }
  void update(std::string message){
    std::cout << "My name is " << name  << " update :"<< message << " yet" << std::endl;
  }
private:
  std::string name;
};

//被 观察者 抽象
class Subject{
  virtual void attach(Observer* observer) = 0;
  virtual void detach(Observer* observer) = 0;
  virtual void update(std::string message) = 0;
};

//具体 被观察者  老师-
class Teacher : public Subject{
  std::list<Observer*> obsererList;
public:
  void attach(Observer* observer){
      obsererList.push_back(observer);
  }
  void detach(Observer* observer){
      obsererList.remove(observer);
  }
  void update(std::string message){
      std::list<Observer*>::iterator it;
      for (it = obsererList.begin(); it != obsererList.end();it++){
        (*it)->update(message);
      }
  }
private:
  std::string name;
};


int main(){
    Teacher mTeacher;
    mTeacher.attach(new Student("小芳"));
    mTeacher.attach(new Student("小曼"));
    mTeacher.attach(new Student("小艾"));

    mTeacher.update(" 布置作业 ...");

    return 0;
}

 

使用场景:

1. 关联行为场景

2. 事件多级触发

3. 跨系统消息交换场景

优点:

1. 抽象 耦合易拓展

2. 方便建立 一套触发机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值