使用Java设计模式中的观察者模式如何开发微信公众号

这篇文章将为大家详细讲解有关使用Java设计模式中的观察者模式如何开发微信公众号,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

观察者(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();    }    }

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。