zoukankan      html  css  js  c++  java
  • 设计模式之观察者模式

    观察者模式

    观察者模式又被称作发布者订阅者模式,是一种管理对象行为和状态之间的关系的方法。这种模式的实质就是你可以对程序中的某个对象的状态进行观察,并且在其发生变化时能够得到通知。

    观察者模式存在两个角色,观察者和被观察者,也就是发布者和订阅者。拿报纸的例子来说读者即是订阅者,报社是发布者,报社把报纸分发给订阅他们的读者,读者进行数据吸收分析。简单来说就是这样一个过程。订阅者从发布者接受数据,发布者需要发送数据。一个订阅者可以订阅多个发布者, 一个发布者可以有很多订阅者,这是一种多对多的关系,需要一种高级的抽象策略,以便订阅者能够彼此独立地变化,发布者可以接受任意的订阅者。

    // 构建发布者类
    function Publisher() {
        this.subscribers = [];
    }
    
    // 定义发布者的发布方法
    Publisher.prototype.deliver = function (data) {
        this.subscribers.forEach(function (fn) {
            fn(data);
        });
    
        return this;
    };
    
    // 暴露出提供给订阅者订阅的接口
    Publisher.prototype.subscribe = function (fn) {
        var alreadyExists = this.subscribers.some(function (el) {
            return el === fn;
        });
    
        if(!alreadyExists) {
            this.subscribers.push(fn);
        }
    
        return this;
    };
    
    // 暴露出取消订阅的接口
    Publisher.prototype.unsubscribe = function (el) {
        this.subscribers = this.subscribers.filter(function (el) {
            return el !== fn;
        });
    
        return this;
    };
    
    
    var publisher = new Publisher();
    var Animation = function (o) {
        this.onStart = new Publisher();
        this.onComplete = new Publisher();
        this.onTween = new Publisher();
    };
    
    Animation.prototype.fly = function () {
        this.onStart.deliver('我要起飞');
        this.onTween.deliver('我正在飞。。。');
        this.onComplete.deliver('飞行结束');
    };
    
    
    var superMan = new Animation({});
    
    superMan.onStart.subscribe(function (data) {
        console.log(data + '1');
    });
    superMan.onStart.subscribe(function (data) {
        console.log(data + '3');
    });
    superMan.onComplete.subscribe(function (data) {
        console.log(data + '1');
    });
    
    superMan.fly();
    
  • 相关阅读:
    C# using的三种用法
    C# 匿名方法和Lambda表达式
    c#中内置委托
    c#委托中的匿名方法和lambda表达式
    java生成条形码
    根据日期筛选和模糊查询
    mysql中ifnull()方法的用法
    mysql数据库中的出发器
    动态SQL之<where>、<if>条件判断
    动态sql
  • 原文地址:https://www.cnblogs.com/idiv/p/8413696.html
Copyright © 2011-2022 走看看