先来看看观察者模式的定义:
定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。
看一张图: 如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:
1、服务号就是主题,业务就是推送消息
2、观察者只需要订阅主题,只要有新的消息就会送来
3、当不想要此主题消息时,取消订阅
4、只要服务号还在,就会一直有人订阅
接下来就是代码时间了,我们模拟一个微信3D彩票服务号,和一些订阅者。
首先开始写我们的主题接口,和观察者接口:
package com.company; import java.util.ArrayList; import java.util.List; public interface Subject { /** * 新增一个观察者 */ public void registerObserver(Observer observer); /** * 删除一个观察者 */ public void removeObserver(Observer observer); /** * 通知所有观察者 */ public void notifyObserver(); } package com.company; public interface Observer { public void update(String msg); }创建一个订阅号
package com.company; import java.util.ArrayList; import java.util.List; public class ConcreteSubject implements Subject { List<Observer> observers = new ArrayList(); 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(observer); } } @Override public void notifyObserver() { for (Observer observer : observers) { observer.update(msg); } } public void setMsg(String msg){ this.msg = msg; notifyObserver(); } }创建两个观察者
package com.company; public class ConcreteObserver implements Observer { private Subject subject; public ConcreteObserver(Subject subject){ this.subject = subject; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer1 得到 3D 号码 --> +" + msg + "+ , 我要记下来。"); } } package com.company; public class ConcreteObserver2 implements Observer{ private Subject subject; public ConcreteObserver2(Subject subject){ this.subject = subject; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer2 得到 3D 号码 --> +" + msg + "+ , 我要记下来。"); } }测试类
package com.company; public class Main { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver concreteObserver1 = new ConcreteObserver(subject); ConcreteObserver2 concreteObserver2 = new ConcreteObserver2(subject); subject.setMsg("hi"); subject.setMsg("hello"); } }其实JDK帮我们提供了工具类Observable 和 Observer 创建一个观察者
package com.company.newjdk; import java.util.Observable; import java.util.Observer; public class Observer1 implements Observer { public void registerObserver(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发来的" + subjectFor3d.getMsg()); } if(o instanceof SubjectForSSQ){ SubjectForSSQ subjectForSSQ = (SubjectForSSQ)o; System.out.println("SubjectForSSQ发来的" + subjectForSSQ.getMsg()); } } }创建两个订阅号
package com.company.newjdk; import java.util.Observable; public class SubjectFor3d extends Observable { private String msg; /** * 新增一条信息 * @param msg */ public void setMsg(String msg){ this.msg = msg; setChanged(); notifyObservers(); } public String getMsg(){ return msg; } } package com.company.newjdk; import java.util.Observable; public class SubjectForSSQ extends Observable { private String msg; /** * 新增一条信息 * @param msg */ public void setMsg(String msg){ this.msg = msg; setChanged(); notifyObservers(); } public String getMsg(){ return msg; } }测试类
package com.company.newjdk; public class test { public static void main(String[] args) { SubjectFor3d subjectFor3d = new SubjectFor3d(); SubjectForSSQ subjectForSSQ = new SubjectForSSQ(); Observer1 observer1 = new Observer1(); observer1.registerObserver(subjectFor3d); observer1.registerObserver(subjectForSSQ); subjectForSSQ.setMsg("hello"); subjectFor3d.setMsg("hi"); } }