观察者模式的定义:
定义了对象之间的一对多的依赖关系,这样一来,当一个对象改变时,他的所有的依赖者都会收到通知
并自动更新。
本模式以微信公众号为例子:
首先看一张逻辑图
如上图所示,服务号就是我们的主题,使用者就是观察者,当服务号更新时,他的所有依赖者就会收到通知。
好了,开始写代码:
首先要写的就是我们的主题接口,和观察者接口:
package 观察者模式;
public interface Observerable {
/***
* 抽象被观察者接口
* 声明了添加、删除、通知观察者方法
* @author jstao
*
*/
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
package 观察者模式;
public interface Observer {
/***
* 抽象观察者
* 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
* @author jstao
*
*/
public void update(String message);
}
然后就是实现类:
package 观察者模式;
import java.util.ArrayList;
import java.util.List;
public class WechatServer implements Observerable{
//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
private List<Observer> list;
private String message;
@Override
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
list.add(o);
}
public WechatServer() {
list = new ArrayList<Observer>();
}
@Override
public void removeObserver(Observer o) {
// TODO Auto-generated method stub
if(!list.isEmpty())
list.remove(o);
}
@Override
public void notifyObserver() {
for(int i = 0; i < list.size(); i++) {
Observer oserver = list.get(i);
oserver.update(message);
}
}
public void setInfomation(String s) {
this.message = s;
System.out.println("微信服务更新消息: " + s);
//消息更新,通知所有观察者
notifyObserver();
}
}
package 观察者模式;
public class User implements Observer{
private String name;
private String message;
public User(String name) {
this.name=name;
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
this.message=message;
read();
}
private void read() {
// TODO Auto-generated method stub
System.out.println(name + " 收到推送消息: " + message);
}
}
最后是测试类:
package 观察者模式;
public class Test {
public static void main(String[] args) {
WechatServer server = new WechatServer();
Observer userZhang = new User("ZhangSan");
Observer userLi = new User("LiSi");
Observer userWang = new User("WangWu");
server.registerObserver(userZhang);
server.registerObserver(userLi);
server.registerObserver(userWang);
server.setInfomation("PHP是世界上最好用的语言!");
System.out.println("----------------------------------------------");
server.removeObserver(userZhang);
server.setInfomation("JAVA是世界上最好用的语言!");
}
}
可以看出,整个架构是一种松耦合,主题的实现不依赖于使用者,当新增用户时,主题的代码也不用改。