观察者模式:探索消息推送与注册中心

一、引入话题-发散思考

1、如果你是安卓开发工程师,是否经常遇到给所有的用户或者特定的用户推送消息的业务场景呢?例如:我曾经做的一款APP就是用极光推送一个消息,下载该APP的用户都能收到消息提示。

2、如果你了解zookeeper分布式调节框架?假设一个集群有1000台机器Master-Slave结构,我想给这个集群修改配置文件,都是一模一样的文件在不同机器上,难道我们一台一台机器修改?答案是当然不能。那怎么解决?那配置文件注册到zookeeper上,然后集群机器监听配置文件的变化,当配置文件改变以后,观察者就能知道,并且对配置文件作出对应的配置。如果兴趣想详细了解看我zookeeper文章介绍。

二、简介

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会接受到通知并且自动更新。

应用场景:

  • 消息推送(广播)
  • 注册中心/消息订阅

场景描述:

假设观察者们都是电灯泡,当他们的state为1的时候,所有的电灯泡都点亮,如果state为0的时候,所有的电灯泡都熄灭。那么假设有一个电灯泡注册中心,也就是总开关,所有的电灯泡的控制权都需在电灯泡注册中心手上,当注册中心设置灯泡的开关为1的时候,所有的电灯泡都会收到一个消息,那么就会根据消息数据做出相应的反应。

二、自定义接口实现

//主题接口
public interface Subject {
     void registerObserver(Observer observer);
     void removeObject(Observer observer);
     void notifyObservers();
}

//主题具体实现类
public class ConcreteSubject implements Subject{

     List<Observer> observers=new ArrayList<Observer>();
     private int state;

     //注册观察者
     @Override
     public void registerObserver(Observer observer) {
           observers.add(observer);
     }

     //移除观察者
     @Override
     public void removeObject(Observer observer) {
           int index=observers.indexOf(observer);
           if(index>=0){
                observers.remove(index);
                return;
           }
     }

     //通知观察者:类似消息推送
     @Override
     public void notifyObservers() {
           for(Observer observer:observers){
                observer.update(this);
           }
     }

     public int getState() {
           return state;
     }

     public void setState(int state) {
           this.state = state;
           notifyObservers();
     }
}

//观察者接口
public interface Observer {
     void update(Subject subject);
}

//观察者实现类
public class ConcreteObserver implements Observer{

     private int state;

     //同步主题的状态
     @Override
     public void update(Subject subject) {
           this.state=((ConcreteSubject)subject).getState();
     }

     public int getState() {
           return state;
     }

     public void setState(int state) {
           this.state = state;
     }
}

//客户端测试类
public class Client {
     public static void main(String[] args) {
           Subject subject=new ConcreteSubject();

           ConcreteObserver observerA=new ConcreteObserver();
           ConcreteObserver observerB=new ConcreteObserver();

           subject.registerObserver(observerA);
           subject.registerObserver(observerB);

           ((ConcreteSubject)subject).setState(10);
           System.out.println("观察者A(订阅者A):"+observerA.getState());
           System.out.println("观察者B(订阅者B):"+observerB.getState());
     }
}

运行结果:
观察者A(订阅者A):10
观察者B(订阅者B):10

三、Java提供API

//具体主题类(继承自主题类Observable)
public class ConcreteSubject extends Observable{
    private int state;
    public void setState(int state) {
        this.state = state;
        setChanged();
        notifyObservers();
    }

    public int getState() {
        return state;
    }
}

//具体观察者(实现javaAPI Observer)
public class ConcreteObserver implements Observer{
     private int state;
     @Override
     public void update(Observable o, Object arg) {
           this.state=((ConcreteSubject)o).getState();
     }

     public int getState() {
           return state;
     }
}

//客户端
public class Client {
     public static void main(String[] args) {
           ConcreteSubject subject=new ConcreteSubject();

           ConcreteObserver observerA=new ConcreteObserver();
           ConcreteObserver observerB=new ConcreteObserver();

           subject.addObserver(observerA);
           subject.addObserver(observerB);
           subject.setState(123);

           System.out.println("观察者A(订阅者A):"+observerA.getState());
           System.out.println("观察者B(订阅者B):"+observerB.getState());
     }
}

运行结构:
观察者A(订阅者A):123
观察者B(订阅者B):123

四、版权声明

  作者:邱勇Aaron

  出处:http://www.cnblogs.com/qiuyong/

  您的支持是对博主深入思考总结的最大鼓励。

  本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,尊重作者的劳动成果。

  参考:Head First 设计模式

时间: 2024-07-30 14:10:47

观察者模式:探索消息推送与注册中心的相关文章

微信订阅号的关注和消息推送中的观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主体对象的状态变化会通知所有观察者对象.观察者模式又叫做发布-订阅模式.模型-视图模式.源-监听器模式或从属者模式.这种模式在我们实际生活中并不鲜见,比如订牛奶.订报纸.我们订阅了某报纸之后,一旦报纸有新版出来,就会送到我们报箱或手中,去过取消订阅,那么也就再也收不到了.有了互联网之后,无论是微博好友还是微信订阅号,我们都可以"关注"和"取消关注",关注了就可以收到信息推动.这些都是观察者

【转载自友盟消息推送iOS文档】在appDelegate中注册推送

1.2   基本功能集成指南 提示 请先在友盟的消息推送管理后台中创建App,获得AppKey和AppSecret 导入SDK 下载 UMessage_Sdk_All_x.x.x.zip并解压缩 导入插件 所需SDK文件夹:UMessage_Sdk_x.x.x 请在你的工程目录结构中,右键选择Add->Existing Files…,选择这个文件夹.或者将这个文件夹拖入XCode工程目录结构中,在弹出的界面中勾选Copy items into destination group's folder

本地消息和消息推送

在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事 情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出 提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后 面会补充通知中心的内容避免初学者对两种概念的混淆. 本文包括下面内容

Shuttle ESB实现局域网消息推送

ESB全称Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物. ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合. 看吧,ESB的功能是如此强大.在java中常用的是Mule ESB,而到了.Net,Shuttle ESB作为一种新生的ESB正在慢慢的被人们所接受.下面通过一个实例讲解Shuttle ES

IOS开发之实现App消息推送(最新)

好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下.(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适) 第一部分 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出

互联网产品消息推送设计策略(转)

在移动互联时代,消息推送越来越受到各个APP的重视,本文就以互金产品为例阐述消息推送的几个类别以及应用的场景方式.运营策略,希望对你有益. 在之前一文中,笔者概括性的介绍了通知功能是互金理财平台的一个基础但重要的功能.消息推送能将个人账户相关.平台相关内容送达终端用户,是为互联网产品一个重要的功能.在移动互联网时代,移动客户端出现寡头效应,消息推送愈发重要,而在互金产品中尤甚. 因此本文将开始重点阐述互金产品消息推送的类别.场景.方式和前后端推送设计策略以及运营策略. 1 定义 本文所指的"互金

IOS消息推送(转)

第一部分 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图. Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器.你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机. 接下来再看一张解释图: 根据上图的逻辑我来给大家解释一下: 1.你的IOS应用

iOS开发之实现App消息推送

本文将带大家做一个简单的IOSApp消息推送教程,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下.(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适) 第一部分 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图. Provider是给你手机应

iOS 10 消息推送(UserNotifications)秘籍总结(一)

背景 iOS10 新特性一出,各个大神就早已研究新特性能给场景智能化所带来的好处(唉,可惜我只是一个小白).我也被安排适配iOS10的推送工作! Apple 表示这是 iOS 有史以来最大的升级(our biggest release yet),更加智能开放的 Siri .强化应用对 3D Touch 支持. HomeKit .电话拦截及全新设计的通知等等… iOS 10 中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用