先来看看观察者模式的定义:
定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。
看一张图:
如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:
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");
}
}