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

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

  而今天我给大家介绍一下在微信订阅号的关注和消息推送中观察者模式的应用。

  在微信的订阅号中,订阅号可以被关注或取消关注,当有新的文章、消息、出现的时候,订阅了的读者都会收到消息。所以可以抽象出来一个共同的抽象类Publisher来实现这些公共的方法。

public abstract class Publisher {
    private List<Subscriber> funs = new ArrayList<Subscriber>();
    private String message;

    public void publishMessage(String message) {
        this.message = message;
        notifyAllSubscribers();
    }

    public String getMessage() {
        return message;
    }

    public void addSubscriber(Subscriber subscriber) {
        funs.add(subscriber);
    }
    public void delSubscriber(Subscriber subscriber) {
        funs.remove(subscriber);
    }
    public void notifyAllSubscribers() {
        Iterator<Subscriber> it = funs.iterator();
        while (it.hasNext()) {
            it.next().update(this);
        }
    }
}

Publisher维护有一个订阅者的集合,其中message统一表示文章、信息或声音作品等各种形式的内容,由publishMessage更新内容,而当有新的内容更新时,会调用notifyAllSubscibers方法来通知所有关注人。这里要注意的是,这种通知是一种回调行为,也就是通过遍历并调用各个subscriberupdate方法来进行通知。

public interface Subscriber {
    void update(Publisher publisher);
}

因此,具体来说,微信订阅号就是一种Publisher。

public class WeixinPublisher extends Publisher {
    private String dingyuehao;

    public WeixinPublisher(String dingyuehao) {
        this.dingyuehao = dingyuehao;
    }

    @Override
    public String toString() {
        return "微信订阅号[" + dingyuehao + "]";
    }
}

而普通的微信用户——即关注者——就是Subscriber。

public class WeixinAccount implements Subscriber {
    private String accountName;

    public WeixinAccount(String accountName) {
        this.accountName = accountName;
    }

    public void update(Publisher publisher) {
        System.out.println(accountName + "的微信收到了来自" + publisher + "的推送文章: " + publisher.getMessage());
    }
}

微信用户实现了具体的update方法,定义了在收到通知后要做哪些操作,比如阅读、转发等等,这里通过打印一行文字来表示。

public class Client {
    public static void main(String[] args) {
        WeixinPublisher publisher = new WeixinPublisher("享学IT");
        publisher.addSubscriber(new WeixinAccount("张三"));
        publisher.addSubscriber(new WeixinAccount("李四"));
        publisher.addSubscriber(new WeixinAccount("王五"));

        publisher.publishMessage("Java设计模式百例-观察者模式");
    }
}

例如,张三执行“关注”操作后,微信订阅号执行addSubscriber操作将他添加到自己的订阅者名单中,当发布新消息时,订阅者都可以收到,输出如下。

张三的微信收到了来自微信订阅号[享学IT]的推送文章: Java设计模式百例-观察者模式

  最后,用一个类图看一下类和接口关系就比较清晰了。

  

从中可以总结出几个观察者模式的特点:

1.观察者模式是一个一对多的关系,一个被观察者对应多个观察者,这种关系通过在被观察者内维护一个观察者的集合来实现。

2.但是与“被围观”不同的是,被观察者拥有添加和删除观察者的方法,主动权在自己手中。

3.当被观察者状态有变动时,也是由被观察者主动通知自己维护的“名单”中的各个观察者,通知是采用回调接口方法的方式。

在java中内置了观察者模式的接口和抽象类Observable.java。其中包含了上诉Publisher类中的各个方法,所以就不用自己写了,可以直接使用Observable。它的使用模式与微信订阅号的关注和消息推送中的观察者模式很相似。

  

本文源码见:https://github.com/get-set/get-designpatterns/tree/master/observer

原文地址:https://www.cnblogs.com/zzyzby/p/9831607.html

时间: 2024-08-10 22:54:17

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

微信小程序开发:设置消息推送

开发设置中,启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中. 不过照着说明去操作,即使按照最简单的明文方式去设置,还是提示Token验证失败.仔细研究说明,其实服务器验证过程很简单,用Get发来一个连接,然后在自己的页面中去检验,不想做也可以先不做,直接返回echostr即可.关键在,怎么返回,开始我还以为必须要按照xml或者json返回,试了半天,其实很简单,清空所有其他输出,直接返回echostr即可. Response.Clear()

微信公众号的自定义菜单事件推送

1.创建自定义菜单 2.组装自定义菜单(JSON格式数据) 微网站:可以实现跳转到微信响应式页面 产品中心:可以实时获取服务器端产品信息,并以图文形式返回 关于我们:可以返回相关的文本信息 微网站:跳转链接 产品中心与关于我们:内部请求 请求代码,请参menu.php页面,创建成功,请取消关注微信公众账号并再次关注,效果如图 3.自定义菜单事件推送 A.接收相关参数(Event和EventKey) 在之前的api.php之中添加代码 B.对参数进行判断与操作 上传代码,效果如下图所示

消息推送 - 微信公众平台订阅用户获取最佳途径

微信公众平台统计功能中用户增长页增加增长来源统计后,我们可以知道用户获取途径大致有①搜索公众号名称②搜索微信号③图文消息右上角菜单④名片分享⑤其他,老贼也在第一时间为我们总结了目前微信公众平台用户获取最佳途径还是通过消息推送,另一个就是互推. 首先是正常运营状态,即指不做任何推广,单纯靠消息推送获取新用户,在这种条件下获取用户最多的途径竟然是……其他!而在这个里面据我观察主要是通过图文消息标题下蓝字关注进来的,也就是说一方面用户通过这种方式点击关注公众号的习惯已经养成,另一方面很多公众账号在头图

消息推送技术

消息推送 消息推送是针对 Web 应用开发领域的技术,指服务端以主动方式将信息送达客户端.主要用于提升用户体验,避免用户刷新页面从服务端拉取数据.例如 Web 邮件中自动出现刚收到的邮件项,Web 即时通讯自动提示新到消息等应用场景. 要实现消息推送机制,涉及两方面的内容: Web 层消息推送 服务层消息服务 Web 层消息推送 套接字 可以使用套接字接口进行全双工通讯.可以通过 Flash XMLSocket.Java Applet 技术实现.但由于实现方案与厂商技术绑定过紧,不属于 Web

手机游戏消息推送使用浅析

--WeCloud 团队 消息推送是游戏开发者与玩家沟通最直接的桥梁,开发者可以通过推送一条消息直观地在手机屏幕上把信息传达给玩家.但是由于开发者一些不恰当推送或者对于推送细节的疏忽大意,使得大多数的玩家都选择了彻底关闭推送消息,开发者其实可以做的更好. 如何让消息推送价值最大化应当结合三个问题进行讨论:一.推什么  二. 推给谁  三.怎么推 一.推什么? 第一个关键的点就是推送的内容,作为一个游戏,频繁地广告以及与游戏类型不符合的消息显然是不讨喜的.那么针对不同类型的游戏,选择什么类型的推送

php 消息推送(含源码)

概述 今天刚好周六,昨天有人在群里问如何实习php的即时通讯.我也搜了搜资料,打算自己实现一遍php消息推送中的-ajax长轮询的.我觉得对php即时通讯的介绍写得比较好的是: http://www.cnblogs.com/hnrainll/archive/2013/05/07/3064874.html 可以参考一下,其他我就不多说了,参考链接,优于用于演示,就没有操作数据库中的东西了. 我的代码 入口代码 index.html <!DOCTYPE HTML> <html> <

微信订阅号消息回复测试

最近在研究微信公众号开发,消息回复是订阅号基础的可获取的接口,因此先从这里开始练起. 我的服务端采用的是新浪的SAE平台,现在要想提交代码,是要每月上交10元的,有500M空间可用. 以腾讯云服务器为示例:腾讯云服务器购买入口,购买指导请参考快速入门linux云服务器. 学生党注意:腾讯公司为在读高校生提供了云+校园计划,1元/月即可使用腾讯云. 开始操作,进入微信公众开发平台后台,个人一般只能申请订阅号(限制主要功能),我这里使用的是微信的[公众平台测试帐号]. 流程: 下载微信php示例代码

关注微信订阅号“程序视界”

我开通了一个微信订阅号--程序视界(微信号programmer_sight),问有些朋友,还不知道怎么关注,所以来写一篇经验文,介绍关注微信订阅号的详细过程. 分两部分吧,关注和阅读. 关注订阅号 第一步 打开微信,切换到微信那个标签页(默认就在那里),如图1: 图1微信 第二步 点击图1右上角的"+"图标(我已用红色圆圈标注),就会出现添加朋友的菜单.菜单中有"添加朋友"和"扫一扫"两个子菜单,我用蓝色下划线标出了.这两种方式都可以添加朋友,&

PHP 微信公众号开发 - 消息推送

项目微信公众号开发,需要做用户消息推送,记录下来以便日后使用 1,接上一篇文章,可以查看如何获取用户openid PHP 微信公众号开发 - 获取用户信息 2,添加模板消息 3,查看模板详情 根据模板详情设置对应推送消息 4,代码实现 1 <?php 2 // 字符编码 3 header("Content-Type:text/html; charset=utf-8"); 4 5 // 微信接口类 6 class WeChat{ 7 private static $appid; 8