mem_fun

使用mem_fun优化观察者模式
本文通过一个观察者模式的实例,展示了如何利用C++中的`std::mem_fun`来简化代码,实现对多个观察者的统一更新操作。

介绍mem_fun的使用示例。

假定的场景

以下假定的场景:观察者模式。subject通知所有的observer有某个新的数据。

代码

#include <functional>
#include <algorithm>
#include <iostream>
#include <list>

class TheData {
public:
    TheData(int x, int y) : _x(x), _y(y) {}

//private:
    int _x;
    int _y;
};

class Observer {
public:
    void Update(const TheData &data) {
        std::cout << "Observer::Update(), id=" << _id << ", x=" << data._x << ", y=" << data._y << std::endl;
    }

    explicit Observer(int id) : _id(id) {}

private:
    int _id;
};

class Subject {
public:
    void RegisterObserver(Observer *bar) {
        m_observers.push_back(bar);
    }

    void Notify(const TheData &data) {
        std::for_each(m_observers.begin(), m_observers.end(), 
            std::bind2nd(std::mem_fun1<void, Observer, const TheData&>(&Observer::Update), data));
    }

private:
    std::list<Observer*> m_observers;
};

int main( )
{   
    Observer* observer1 = new Observer(1);
    Observer* observer2 = new Observer(2);
    Observer* observer3 = new Observer(3);

    Subject subject;
    subject.RegisterObserver(observer1);
    subject.RegisterObserver(observer2);
    subject.RegisterObserver(observer3);

    TheData data(10, 20);
    subject.Notify(data);

    data._x = 15;
    data._y = 25;
    subject.Notify(data);

    delete observer1;
    delete observer2;
    delete observer3;

    return 0;
}

运行结果

Observer::Update(), id=1, x=10, y=20
Observer::Update(), id=2, x=10, y=20
Observer::Update(), id=3, x=10, y=20
Observer::Update(), id=1, x=15, y=25
Observer::Update(), id=2, x=15, y=25
Observer::Update(), id=3, x=15, y=25
请按任意键继续. . .

说明

使用for_each总是比iterator要简洁一些,所以在能够用for_each的地方,就避免使用下面迭代器的方式:

void Notify2(const TheData &data) {
    std::list<Observer*>::iterator i(m_observers.begin());
    for (; i != m_observers.end(); ++i) {
        (*i)->Update(data);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值