第一、观察者模式定义
观察者模式(ObServer Pattern)定义对象之间的一对多的依赖,让多个观察者对象同时监听一个对象,当主体对象发生变化时,它的所有依赖者(观察者)
都会收到通知并更新,其实就是发布定义模式,发布者发布消息,订阅者获取消息,订阅了就能接收到消息,没有订阅就接收不到消息。
第二、观察者模式应用场景
Zookeeper事件通知节点、消息订阅通知、安卓开发事件注册分布式配置中心
第三、观察者模式原理类图
抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,
可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态
第四、观察者模式简单实现
/**
* 抽象主题
*/
public interface AbstractSubject {
/**
* 添加ObServer 添加订阅者
* @param obServer
*/
public void addObServer(ObServer obServer);
/**
* 移除ObServer
* @param obServer
*/
public void removeObServer(ObServer obServer);
/**
* 通知所有的ObServer
* @param message
*/
public void notifyObServerAll(String message);
/**
* 设置更新内容
* @param message
*/
public void setNtifyMessage(String message);
}
/**
* 抽象观察者
*
*/
public interface ObServer {
//更新内容
public void update(String message);
}
/**
* 具体观察者
*/
public class UserObServer implements ObServer {
private String name;
public UserObServer(String name){
this.name = name;
}
@Override
public void update(String message) {
this.name = name;
this.read(message);
}
/**
* 读取消息
* @param message
*/
public void read(String message) {
System.out.println(name + ",老师收到推送消息:" + message);
}
}
/**
* 抽象主题
*/
public class WeChatSubject implements AbstractSubject {
private List<ObServer> obServerList = new ArrayList<ObServer>();
private String message;
@Override
public void addObServer(ObServer obServer) {
obServerList.add(obServer);
}
@Override
public void removeObServer(ObServer obServer) {
obServerList.remove(obServer);
}
@Override
public void notifyObServerAll(String message) {
for (ObServer server : obServerList) {
server.update(message);
}
}
@Override
public void setNtifyMessage(String message) {
this.message = message;
System.out.println("微信公众号设置message:" + message);
//通知所有的订阅者接收消息
notifyObServerAll(message);
}
}
/**
* 测试类
*/
public class Test001 {
public static void main(String[] args) {
//注册主题
AbstractSubject weChatSubject = new WeChatSubject();
weChatSubject.addObServer(new UserObServer("小强"));
weChatSubject.addObServer(new UserObServer("小张"));
//发送消息
weChatSubject.setNtifyMessage("今天下午到我办公室来一趟!!!有重大的事情安排");
}
}
第五、JDK自带观察实现消息发送
(1). Observable类追踪所有的观察者,并通知他们。
(2). Observer这个接口看起来很熟悉,它和我们之前写的类几乎一样。
/**
* JDK提供的一种观察者的实现方式,被观察者
* 自定义一个主题
*/
public class MessageObServable extends Observable {
private String name;
MessageObServable(String name){
this.name = name;
}
public void publishMessage(Message message){
System.out.println(message.getName() + "在" + this.name + "上提交了一个问题。");
//改变数据
setChanged();
//通知所有的观察者
notifyObservers(message);
}
}
/**
* 信息实体
*/
public class Message {
private String name;
private String content;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
/**
*自定义观察者
*/
public class Teacher implements Observer {
private String name;
public Teacher(String name){
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
MessageObServable userObServer = (MessageObServable) o;
Message message = (Message) arg;
System.out.println(this.name+"向"+message.getName()+"描述了:"+message.getContent());
}
}
/**
* 测试类
*/
public class Test001 {
public static void main(String[] args) {
MessageObServable messageObServable = new MessageObServable("张三");
messageObServable.addObserver(new Teacher("李四"));
messageObServable.addObserver(new Teacher("王五"));
Message message = new Message();
message.setName("王五");
message.setContent("今天迟到了!!!!");
messageObServable.publishMessage(message);
}
}