一、定义
在对象之间定义一对多的依赖,当一个对象改变状态时,依赖它的对象会收到通知并自动更新。
二、模式结构
1.抽象被观察者接口:即是一个抽象主题,把所有对观察者对象的引用保存在一个集合中,每个主体都能有任意数量的观察者。该接口提供三个方法:添加、删除、通知观察者角色。
2.抽象观察者接口:为所有具体观察者定义的接口,在得到主题通知时更新自己。
3.具体被观察者类:即一个具体主题,在主体的内部状态改变时,会向所有登记过的观察者发出通知。
4.具体观察者类:实现抽象观察者接口。
三、应用实例
一个微信公众号服务,不定时发布信息,关注公众号的用户就能收到推送信息,取消关注就接收不到。
四、代码实现
1.抽象被观察者接口
/**
* 抽象被观察者接口
* 声明了添加、删除、通知观察者方法
*/
public interface Observerable {
void addObserver(Observer o);
void deleteObserver(Observer o);
void notifyObserver(String s);
}
2.抽象观察者接口
/**
* 抽象观察者接口
* 定义了一个update方法,当被观察者调用notify时,观察者的update方法会被回调。
*/
public interface Observer {
void update(String message);
}
3.具体被观察者类,以微信公众号为例
/**
* 具体被观察者,例如:微信公众号服务
* 实现了Observerable接口
*/
public class WechatServer implements Observerable{
// 设计原则:面向接口编程
private List<Observer> list;
private String message;
public WechatServer(){
list=new ArrayList<Observer>();
}
@Override
public void addObserver(Observer o) {
list.add(o);
}
@Override
public void deleteObserver(Observer o) {
if(!list.isEmpty()){
list.remove(o);
}
}
@Override
public void notifyObserver(String s) {
this.message = s;
System.out.println("微信服务更新消息: " + s);
for (Observer o:list){
o.update(message);
}
}
}
4.具体观察者类,以微信用户为例
/**
* 具体观察者,例如关注了微信公众号的用户
*/
public class User implements Observer {
private String name;
private String message;
public User(String name){
this.name=name;
}
@Override
public void update(String message) {
this.message=message;
System.out.println(name+"收到推送信息:"+message);
}
}
5.测试类
public class Test {
public static void main(String []args){
WechatServer server=new WechatServer();
User user1=new User("user1");
User user2=new User("user2");
User user3=new User("user3");
server.addObserver(user1);
server.addObserver(user2);
server.addObserver(user3);
server.notifyObserver("kao1");
System.out.println("--------------------------------");
server.deleteObserver(user3);
server.notifyObserver("kao2");
}
}