观察者2

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <functional>
#include <map>
#include <algorithm>
using namespace std;
class NonCopyable {
protected:
    NonCopyable() = default;
    ~NonCopyable()=default;
    NonCopyable(const NonCopyable& ) =delete;
    NonCopyable& operator=(const NonCopyable&)=delete; };
template<typename Func>
class Events : NonCopyable {
private:
    int m_observerId =0;// 观察者对应的编号
    std::map<int, Func>  m_connections; //观察者列表
    //保存观察者并分配观察者的编号
    template<typename F>
    int Assign2(F&& f) {
        int k = m_observerId++;
        m_connections.emplace(k, std::forward<F>(f));
        return k;
    }
public:
    Events(){};
    ~Events(){}
    // 注册观察者 支持右值引用
    int Connect(Func&& f) {  return Assign2(f); }
    // 注册观察者
    int Connect(const Func& f) {  return Assign2(f); }
    void Disconnect(int key) { m_connections.erase(key); }
    // 通知所有的观察者
    template<typename ... Args>
    void Notify(Args&&... args) {
        for(auto& it  : m_connections)
            it.second(std::forward<Args>(args)...);
    }
};
struct stA{
    int a, b;
    void print(int a, int b){ cout<<a<<", "<<b<<endl; }
    void print2(){ cout<<a<<", "<<b<<endl; }
};
void print(int a, int b){ cout<<a<<", "<<b<<endl;}
void test1() {
    Events<std::function<void(int, int)>> myevent;
    auto key = myevent.Connect(print);//以函数方式注册观察者
    stA  t;
    auto lambdakey = myevent.Connect([&t](int a, int b){ t.a=a; t.b=b; t.print2(); });
    //auto lambdakey = myevent.Connect([&t](int a, int b){ t.a=a; t.b=b;});
    std::function<void(int,int)> f = std::bind(&stA::print,&t, std::placeholders::_1,std::placeholders::_2);
    myevent.Connect(f);

int a=11, b=12;
    myevent.Notify(a,b);
    cout<<"key = "<<key<<endl;
    myevent.Disconnect(key);
}
int main()
{
    test1();
    return 0;
}

时间: 2024-10-21 02:38:26

观察者2的相关文章

Ember.js 入门指南——观察者(observer)

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站. 1,观察者使用 Ember可以察觉所有属性的变化,包括计算属性.观察者是非常有用的,特别是计算属性绑定之后需要同步的时候. 观察者经常被Ember开发过度使用.Ember框架本身已经大量使用观察者,但是对于大多数的开发者面对开发问题时使用计算属性是更适合的解决方案. 使用方式:可以用"Ember.observer"设置一个对象为观察者. // Observer对于Emberjs来说

属性观察者(监听属性的变化)

// 属性观察者, 用于监听属性变化, 在属性变化的时候调用 class Person { var name: String = "" { // 也可以写成willSet{}, 系统默认会传入一个名为newValue的参数 willSet(newValue) { print("name这个属性将被修改了, \(newValue)") } // 也可以写成didSet{} didSet(newValue) { print("name这个属性已经被修改了, \

理解设计模式(观察者)

观察者模式,保证主题和若干观察者之间的一致性. 概述 有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式 此种模式通常被用来实现事件处理系统 特定环境 一个对象改变,同时引发其他若干对象发生变化时 主动改变的对象和被动变化的对象之间相对独立,以便复用和维护 一类问题 一个系统,由一个对象和若干协作对象组成,同时要避免这些对象之间相互耦合 解决方案 抽象主题角色 具体主题角色 抽象观察者角色 具体观察者角色 抽象主题角色

Observer(观察者)模式

1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你如何通知其他对象?是否需要一个动态方案――一个就像允许脚本的执行一样,允

设计模式——观察者

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,他的所有的依赖者都会收到通知并自动更新: 定义主题,主题的功能是持有观察者的引用,提供注册.取消注册和通知,并且有状态:观察者实现接口中的update方法,必须注册具体主题: JDK自带了对观察者的支持功能 被观察者Observable对象,提供add/delete/notifyObserver()和setChanged()设置状态方法 观察者Observer接口,提供update()方法进行相关的更新操作. 观察者类图: 以下程序模拟

Cocos中的观察者设计模式与通知机制

观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是 MVC( 模型-视图-控制器)模式的重要组成部分.天气一直是英国人喜欢讨论的话题,而最近几年天气的变化也成为中国人非常关注的话题.我会根据天气预报决定是坐地铁还是开车上班,我的女儿也会根据天气预报决定明天穿哪件衣服.于是我在移动公司为我的手机定制了天气预报短信通知服务,它的工作模型如图所示. 每天气象局将天气预报信息投送给移动运营商,移动运营商的短信中心负责把天气预报发送给定制过这项服务的手机.在软件系统

观察者模式分析、结构图及基本代码

 定义:观测者模式定义了一种一对多的依赖关系,让多个观测者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观测者对象,使它们能够自动更新自己. 结构图: Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现.它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者.抽象主题提供一个接口,可以增加和删除观测者. Observe类,抽象观测者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己.这个接口叫更新接口.抽象观察者

观察者设计模式

/** * 事件接口即被观察者 * * @author Host * */ publicinterface Event { void attach(Listener listener); void detach(Listener listener); void notifyListener(); } /** * 事件监听者观察者 * * @author Host * */ publicinterface Listener { void execute(); } 事件源的一个实现类(磁盘事件) p

内容观察者

在Android项目中我们常常需要检测另一个应用私有数据的变化与否,如何检测另一个数据库应用中的数据变化,我们通过下面的案例来讲述具体的操作. 应用场景:有两个应用,一个是"01_数据库应用",另一个是"07_内容观察者":第二个应用监测第一个应用数据库的变化,当第一个应用数据库发生变化便即时通知第二个应用.实现方法如下: 轮询 若要监测数据库中数据的变化与否,我们可以在当前应用中编写一个定时器,该定时器的工作是每隔一段时间查询数据库中的数据,将查询的结果与之前查询

内容观察者使用(程序锁应用中的使用)

1.在Dao层的增删改查方法中,添加一句代码,通知内容观察者,数据库发生改变. context.getContentResolver().notifyChange(Uri.parse("content://applock/change"), null); 参数1:自定义Uri,在注册内容观察者时匹配 2.在需要使用内容观察者的类中(即DogService),注册内容观察者.一旦数据库的数据发生改变,就要调用内容观察者中的onchange方法,在这里就是再一次findAll(). //使