最新消息:想得多,做的少。一天到晚瞎鸡巴搞。

观察者模式

瞎扯设计模式 阿虚 601浏览 0评论

.     观察这模式,这个模式也是一个挺简单的模式。我开设了一个“宅男福利”的一个服务。每天我会不定时更新资源“发送”给订阅了“宅男福利”服务的“群众”。不明白的话就看看手机微信里面的公众号吧。每当公众号有新的内容就会推送给订阅的用户,你取消关注了微信公众号就不会再有推送。 观察者模式就这么个意思。

不过我写到这里的时候脑子里又冒出来感觉不就是一个TCP连接么。。

//观察者基类
class Observer
{
public:
    Observer(){};
    virtual ~Observer(){};

    //当被观察者有新的数据来时会调用这个函数。
    //其中参数就是被观察者提供给观察者所能看到的数据。
    virtual void updata(int n1, int n2, int n3) = 0;
};

//服务对象基类
class Subject
{
public:
    Subject(){};
    virtual ~Subject(){};

public:
    //注册观察者
    virtual void registerObserver(Observer* o) = 0;
    //移除观察者
    virtual void removeObserver(Observer* o) = 0;
    //更新信息
    virtual void notifyObserver() = 0;
};

//显示
class DispayElement
{
public:
    DispayElement(){};
    virtual ~DispayElement(){};

    virtual void display() = 0;
};

//你可以看做是某个微信公众号
class WeatherData : public Subject
{
public:
    WeatherData(){};
    virtual ~WeatherData(){};

public:
    //注册观察者,当有用户订阅这个微信号
    virtual void registerObserver(Observer* o)
    {
        //将用户this指针存储起来
        m_Arry.push_back(o);
    }
    //移除观察者,当用户决定取消订阅这个微信号
    virtual void removeObserver(Observer* o)
    {
        list<Observer*>::iterator it;
        for (it = m_Arry.begin(); it != m_Arry.end(); it++)
        {
            //找到他的ID
            if ((*it) == o)
            {
                //移除他
                it = m_Arry.erase(it);
            }
        }
    }

    //更新信息
    virtual void notifyObserver()
    {
        list<Observer*>::iterator it;
        for (it = m_Arry.begin(); it != m_Arry.end(); it++)
        {
            //新的内容发送给所有订阅了当前公众号的围观者。
            (*it)->updata(n1, n2, n3);
        }
    }
    
    void measurementsChanged()
    {
        notifyObserver();
    }

    //当有新的信息更新时
    void setMeasurements(int n1, int n2, int n3)
    {
        this->n1 = n1;
        this->n2 = n2;
        this->n3 = n3;
        measurementsChanged();
    }

private:
    list<Observer*> m_Arry;
    int n1;
    int n2;
    int n3;
};


//这是张三
class ZhangSan : public Observer, public DispayElement
{
public:
    ZhangSan(Subject *weatherData)
    {
        //构造时就订阅了这个公众微信号
        this->weatherData = weatherData;
        //如果不明白这里为什么可以传递,自行翻阅C++基础书籍或《c++反汇编与逆向分析技术揭秘·钱林松》
        weatherData->registerObserver(this);
    };
    virtual ~ZhangSan(){};
    
    //当公众号有更新时自动调用这里
    virtual void updata(int n1, int n2, int n3)
    {
        this->n1 = n1;
        this->n2 = n2;
        this->n3 = n3;
        //更新后立即显示
        display();
    }
    
    virtual void display()
    {
        printf("zhangsan : n1 = %d n2 = %d n3 = %d \r\n", n1, n2, n3);
    }
    
private:
    int n1;
    int n2;
    int n3;
    
    //为什么要存储一个公众号的指针。
    //因为
    Subject *weatherData;
};


class LiSi : public Observer, public DispayElement
{
public:
    LiSi(Subject *weatherData)
    {
        this->weatherData = weatherData;
        weatherData->registerObserver(this);
    };
    virtual ~LiSi(){};
    
    virtual void updata(int n1, int n2, int n3)
    {
        this->n1 = n1;
        this->n2 = n2;
        this->n3 = n3;
        display();
    }
    
    virtual void display()
    {
        printf("LiSi : n1 = %d n2 = %d n3 = %d \r\n", n1, n2, n3);
    }
    
    void remove()
    {
        weatherData->removeObserver(this);
    }

private:
    int n1;
    int n2;
    int n3;
    
    Subject *weatherData;
};


int main()
{
    WeatherData *WeiXinFuWuHao= new WeatherData;

    ZhangSan *z3 = new ZhangSan(WeiXinFuWuHao);
    LiSi *l4 = new LiSi(WeiXinFuWuHao);

    //推送新的信息
    WeiXinFuWuHao->setMeasurements(1, 2, 3);

    WeiXinFuWuHao->setMeasurements(4, 5, 6);

    //Li4决定取消关注
    l4->remove();

    WeiXinFuWuHao->setMeasurements(7, 8, 9);

    return 0;
}

转载请注明:虚无 » 观察者模式

与本文相关的文章

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址