• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >微信公众号 > 用Java设计模式中的观察者模式开发微信公众号的实例代码

用Java设计模式中的观察者模式开发微信公众号的实例代码

作者:匿名 字体:[增加 减小] 来源:互联网

匿名通过本文主要向大家介绍了Java,观察者模式等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
这篇文章主要介绍了用Java设计模式中的观察者模式开发微信公众号的例子,这里Java的微信SDK等部分便不再详述,只注重关键部分和开发过程中观察者模式优点的体现,需要的朋友可以参考下

还记得警匪片上,匪徒们是怎么配合实施犯罪的吗?一个团伙在进行盗窃的时候,总有一两个人在门口把风——如果有什么风吹草动,则会立即通知里面的同伙紧急撤退。也许放风的人并不一定认识里面的每一个同伙;而在里面也许有新来的小弟不认识这个放风的。但是这没什么,这个影响不了他们之间的通讯,因为他们之间有早已商定好的暗号。
呵呵,上面提到的放风者、偷窃者之间的关系就是观察者模式在现实中的活生生的例子。

观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
在这里先讲一下面向对象设计的一个重要原则——单一职责原则。因此系统的每个对象应该将重点放在问题域中的离散抽象上。因此理想的情况下,一个对象只做一件事情。这样在开发中也就带来了诸多的好处:提供了重用性和维护性,也是进行重构的良好的基础。
因此几乎所有的设计模式都是基于这个基本的设计原则来的。观察者模式的起源我觉得应该是在GUI和业务数据的处理上,因为现在绝大多数讲解观察者模式的例子都是这一题材。但是观察者模式的应用决不仅限于此一方面。


好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。
看一张图:

用Java设计模式中的观察者模式开发微信公众号的实例代码

其中每个使用者都有上图中的3条线,为了使图片清晰省略了。
如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:
1、服务号就是主题,业务就是推送消息
2、观察者只需要订阅主题,只要有新的消息就会送来
3、当不想要此主题消息时,取消订阅
4、只要服务号还在,就会一直有人订阅
好了,现在我们来看看观察者模式的类图:

用Java设计模式中的观察者模式开发微信公众号的实例代码

接下来就是代码时间了,我们模拟一个微信3D彩票服务号,和一些订阅者。
首先开始写我们的主题接口,和观察者接口:

package com.zhy.pattern.observer; 
 
/** 
 * 主题接口,所有的主题必须实现此接口 
 * 
 * @author zhy 
 * 
 */ 
public interface Subject 
{ 
  /** 
   * 注册一个观察着 
   * 
   * @param observer 
   */ 
  public void registerObserver(Observer observer); 
 
  /** 
   * 移除一个观察者 
   * 
   * @param observer 
   */ 
  public void removeObserver(Observer observer); 
 
  /** 
   * 通知所有的观察着 
   */ 
  public void notifyObservers(); 
 
} 
package com.zhy.pattern.observer; 
 
/** 
 * @author zhy 所有的观察者需要实现此接口 
 */ 
public interface Observer 
{ 
  public void update(String msg); 
 
}

接下来3D服务号的实现类:

package com.zhy.pattern.observer; 
 
import java.util.ArrayList; 
import java.util.List; 
 
public class ObjectFor3D implements Subject 
{ 
  private List<Observer> observers = new ArrayList<Observer>(); 
  /** 
   * 3D彩票的号码 
   */ 
  private String msg; 
 
  @Override 
  public void registerObserver(Observer observer) 
  { 
    observers.add(observer); 
  } 
 
  @Override 
  public void removeObserver(Observer observer) 
  { 
    int index = observers.indexOf(observer); 
    if (index >= 0) 
    { 
      observers.remove(index); 
    } 
  } 
 
  @Override 
  public void notifyObservers() 
  { 
    for (Observer observer : observers) 
    { 
      observer.update(msg); 
    } 
  } 
 
  /** 
   * 主题更新消息 
   * 
   * @param msg 
   */ 
  public void setMsg(String msg) 
  { 
    this.msg = msg; 
     
    notifyObservers(); 
  } 
 
}

模拟两个使用者:

package com.zhy.pattern.observer; 
 
public class Observer1 implements Observer 
{ 
 
  private Subject subject; 
 
  public Observer1(Subject subject) 
  { 
    this.subject = subject; 
    subject.registerObserver(this); 
  } 
 
  @Override 
  public void update(String msg) 
  { 
    System.out.println("observer1 得到 3D 号码 -->" + msg + ", 我要记下来。"); 
  } 
 
}
package com.zhy.pattern.observer; 
 
public class Observer2 implements Observer 
{ 
  private Subject subject ;  
   
  public Observer2(Subject subject) 
  { 
    this.subject = subject ; 
    subject.registerObserver(this); 
  } 
   
  @Override 
  public void update(String msg) 
  { 
    System.out.println("observer2 得到 3D 号码 -->" + msg + "我要告诉舍友们。"); 
  } 
   
   
 
}

可以看出:服务号中维护了所有向它订阅消息的使用者,当服务号有新消息时,通知所有的使用者。整个架构是一种松耦合,主题的实现不依赖与使用者,当增加新的使用者时,主题的代码不需要改变;使用者如何处理得到的数据与主题无关;
最后看下测试代码:

package com.zhy.pattern.observer.test; 
 
import com.zhy.pattern.observer.ObjectFor3D; 
import com.zhy.pattern.observer.Observer; 
import com.zhy.pattern.observer.Observer1; 
import com.zhy.pattern.observer.Observer2; 
import com.zhy.pattern.observer.Subject; 
 
public class Test 
{ 
  public static void main(String[] args) 
  { 
    //模拟一个3D的服务号 
    ObjectFor3D subjectFor3d = new ObjectFor3D(); 
    //客户1 
    Observer observer1 = new Observer1(subjectFor3d); 
    Observer observer2 = new Observer2(subjectFor3d); 
 
    subjectFor3d.setMsg("20140420的3D号码是:127" ); 
    subjectFor3d.setMsg("20140421的3D号码是:333" ); 
     
  } 
}

输出结果:

observer1 得到 3D 号码 -->20140420的3D号码是:127, 我要记下来。 
observer2 得到 3D 号码 -->20140420的3D号码是:127我要告诉舍友们。 
observer1 得到 3D 号码 -->20140421的3D号码是:333, 我要记下来。 
observer2 得到 3D 号码 -->20140421的3D号码是:333我要告诉舍友们。

对于JDK或者Andorid中都有很多地方实现了观察者模式,比如XXXView.addXXXListenter , 当然了 XXXView.setOnXXXListener不一定是观察者模式,因为观察者模式是一种一对多的关系,对于setXXXListener是1对1的关系,应该叫回调。

恭喜你学会了观察者模式,上面的观察者模式使我们从无到有的写出,当然了java中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer。
下面我们使用Java内置的类实现观察者模式:

首先是一个3D彩票服务号主题:

package com.zhy.pattern.observer.java; 
 
import java.util.Observable; 
 
public class SubjectFor3d extends Observable 
{ 
  private String msg ;  
   
   
  public String getMsg() 
  { 
    return msg; 
  } 
 
 
  /** 
   * 主题更新消息 
   * 
   * @param msg 
   */ 
  public void setMsg(String msg) 
  { 
    this.msg = msg ; 
    setChanged(); 
    notifyObservers(); 
  } 
}

下面是一个双色球的服务号主题:

package com.zhy.pattern.observer.java; 
 
import java.util.Observable; 
 
public class SubjectForSSQ extends Observable 
{ 
  private String msg ;  
   
   
  public String getMsg() 
  { 
    return msg; 
  } 
 
 
  /** 
   * 主题更新消息 
   * 
   * @param msg 
   */ 
  public void setMsg(String msg) 
  { 
    this.msg = msg ; 
    setChanged(); 
    notifyObservers(); 
  } 
}
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 微信支付验证或签名失败是什么原因?附三种解决方案
  • 微信公众号开发,实现倒计时的一个功能(纯代码)
  • 还是代码好用,几步就能判断用户是否已关注公众号
  • Java微信开发之自定义菜单的创建
  • 微信二次开发之各类型消息封装
  • 微信二次开发之文本消息请求与发送
  • 二次开发微信之请求验证
  • 微信分类接收消息以及创建实体的java代码实例
  • 接收微信服务器post消息体的java代码示例
  • 教你如何用JS和JAVA 判断是否是微信浏览器

相关文章

  • 微信开发asp.net
  • 通过accesstoken获取用户黑名单列表(微信开发教程)
  • ajax 实现微信网页授权登录的方法介绍
  • 公众号支付接口的开发
  • 微信公众平台开发之获得ACCESSTOKEN .Net详解及实例
  • ASP.NET Core集成微信登录的实例图解
  • 微信支付的开发流程详细介绍
  • 分享.net开发微信公众平台实例的教程
  • 网页授权获取用户信息的方法
  • .Net开发微信公众平台之自定义菜单代码详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 有关摩拜单车的课程推荐10篇
    • 微信开发asp.net
    • 微信获取地理位置的图文详解
    • 微信网页获取用户基本信息的方法
    • 最新整理出的微信分享后端接口实现的大致流程
    • 分享微信开发自定义菜单的处理示例代码
    • 微信开发在线点播电影网ckplayer播放器实例介绍
    • 做一个移动端微信公众号(附代码)
    • asp.net开发微信公众平台(6)阶段总结、服务搭建、接入
    • 微信公众开发使用消息接的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有