设计模式之观察者模式

hello,各位朋友好,我们公司最近用到了观察者模式,碰巧小弟之前没有学过观察者模式,于是只好到网上查了一下资料,自学了一下,现在想在这里跟大家分享一下心得。

  一、前言

  二、观察者模式做什么用

  三、观察者模式的基本原理

  四、对观察者模式的扩展

  五、总结

  一、前言

    首先跟大家说一个情景。比如现在我们再公司里打游戏,看股票(我相信没有人没在工作的时候玩过这些),那么这个时候你的老板回来了,看到了这些估计大概率会对你不满,那么为了得到一个两全之法该怎么做呢?很简单,买通一个老板身边的人(比如说老板的秘书吧),然后等老板回来的时候通风报信,这样你就可以为所欲为了(呵呵呵)。那么这个过程就是观察者模式了。

  二、观察者模式做什么用

    好的,我们说一下再代码中的应用。比如说我们现在底层有一个单片机吧,这个单片机控制着一个红外发射器,OK。那么当我们想办法触发到红外的时候,那么单片机会给我们应用层传递这个信号让我们去处理。那么这个过程也就需要用到观察者模式了。

    首先我们分析一下这个问题,当单片机触发到红外信号向上发送的时候首先肯定不是进程间通信,也不是线程间通信,所以最好用的方法就是函数调用。那么这个其实我理解观察者模式的核心内容。是不是挺简单的呢?好的,那么有人可能会立刻提问,为什么不用函数调用呢?好的,现在有两个问题,比如说我们现在传送的是两个模块,那么我们用函数调用,如果我们加到三个,四个呢?我们可能要把代码之前的架构重新打破,这样是不好的,所以这个时候我们的观察者模式就要上了。

  三、观察者模式的基本原理

    诚如刚刚所说,观察者的模式的核心内容就是函数调用,那么具体是怎么实现的呢?就是一个类中包含另一个类,然后通过调用第一个类中的函数进而调到第二个类中。以下就是该设计模式的类图。

      

    简单来说一下,这里的boss和secretary就是被观察者,stockObserver和NBAObserver就是观察者,我们可以看到,被观察者中包含着观察者的List,所以只要我们把观察者放进被观察者中的部分,就可以被通知了。那么他的代码逻辑是这样的:

  // notify

void secretary::notify(int state)
{
    for (auto iter = l.begin();iter != l.end();iter++) {
        (*iter)->update(state);
    }
}
以上就是被观察者如何把消息传送到观察者的。
// 以下为客户端程序
   secretary *concreteSecretary = new secretary();
    observer *concreteStock = new stockObserver("linzhongjing", concreteSecretary);
    concreteSecretary->attach(concreteStock);
    concreteSecretary->notify(1);
  通过这样,我们就可以把消息全部传送到观察者中了。

四、对观察者模式的扩展

  以上为最简单的观察者模式,但是现在有一个问题呀,就是以上我们只定义了被观察者向观察者模式发送数据,但是如果观察者向被观察者要数据呢?那么我们要怎么处理呢?其实解决方法很简单,只要再观察者中添加被观察者对象就行了。代码逻辑如下:

class stockObserver : public observer {
private:
    subject *m_s;
    std::string m_name;
public:
    stockObserver();
    stockObserver(std::string name);
    stockObserver(std::string name, subject *s);
    virtual ~stockObserver();
    void update(int state);
    int getState();
};

  // 客户端程序
  secretary *concreteSecretary = new secretary();
   observer *concreteStock = new stockObserver("linzhongjing", concreteSecretary);
    concreteSecretary->attach(concreteStock);
    if (concreteStock->getState()) {
        std::cout<<"boss comes in stock"<<std::endl;
    }

当然,你可能会问,为啥观察者不把被观察者也写一个list呢?答案很简单,这是因为设计模式是但输入单输出原则的。

  另一个扩展就是把观察者和被观察者写成接口的形式,用多态的方法来呈现。

  五、总结

    观察者模式所实现的是一种一对多传消息的过程,他既可以是被观察者主动下发消息,也可以是观察者主动索要消息。他的核心原则就是函数调用。

  再这里再简单说一下,小弟工作到现在,真正工作当中用到的设计模式一共有三种,分别是代理模式,观察者模式以及单例模式。其他的都是自己玩玩了。

原文地址:https://www.cnblogs.com/songyuchen/p/14019484.html