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

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

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

这篇文章主要介绍了用Java设计模式中的观察者模式开发微信公众号的例子,这里Java的微信SDK等部分便不再详述,只注重关键部分和开发过程中观察者模式优点的体现,需要的朋友可以参考下

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

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

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

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

接下来就是代码时间了,我们模拟一个微信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();   } }
登录后复制

最后是我们的使用者:

package com.zhy.pattern.observer.java;  import java.util.Observable; import java.util.Observer;  public class Observer1 implements Observer {    public void registerSubject(Observable observable)   {     observable.addObserver(this);   }    @Override   public void update(Observable o, Object arg)   {     if (o instanceof SubjectFor3d)     {       SubjectFor3d subjectFor3d = (SubjectFor3d) o;       System.out.println("subjectFor3d's msg -- >" + subjectFor3d.getMsg());     }      if (o instanceof SubjectForSSQ)     {       SubjectForSSQ subjectForSSQ = (SubjectForSSQ) o;       System.out.println("subjectForSSQ's msg -- >" + subjectForSSQ.getMsg());     }   } }
登录后复制

看一个测试代码:

package com.zhy.pattern.observer.java;  public class Test {   public static void main(String[] args)   {     SubjectFor3d subjectFor3d = new SubjectFor3d() ;     SubjectForSSQ subjectForSSQ = new SubjectForSSQ() ;          Observer1 observer1 = new Observer1();     observer1.registerSubject(subjectFor3d);     observer1.registerSubject(subjectForSSQ);               subjectFor3d.setMsg("hello 3d'nums : 110 ");     subjectForSSQ.setMsg("ssq'nums : 12,13,31,5,4,3 15");        } }
登录后复制

测试结果:

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();   }  }0
登录后复制

可以看出,使用Java内置的类实现观察者模式,代码非常简洁,对了addObserver,removeObserver,notifyObservers都已经为我们实现了,所有可以看出Observable(主题)是一个类,而不是一个接口,基本上书上都对于Java的如此设计抱有反面的态度,觉得Java内置的观察者模式,违法了面向接口编程这个原则,但是如果转念想一想,的确你拿一个主题在这写观察者模式(我们自己的实现),接口的思想很好,但是如果现在继续添加很多个主题,每个主题的ddObserver,removeObserver,notifyObservers代码基本都是相同的吧,接口是无法实现代码复用的,而且也没有办法使用组合的模式实现这三个方法的复用,所以我觉得这里把这三个方法在类中实现是合理的。

以上就是用Java设计模式中的观察者模式开发微信公众号的实例代码的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:微信小程序开发之实现选项卡的页面切换
下一篇:bootstrapTable如何重新加载数据?3种方式了解一下!

发表评论

关闭广告
关闭广告