一、基本概念
观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化的时候,它的所有的依赖者(观察者)都会收到通知并更新,属于行为型模式。
观察者模式有时也叫发布订阅模式。
二、生活实例
消息通知
三、代码示例
3.1 JDK方式
/**
* @description:JDK提供的观察者的实现方式
* @author: annecheng,2019-06-30 20:21
*/
public class Wechat extends Observable{
private String name = "微信";
private static Wechat wechat = null;
private Wechat() {
}
public static Wechat getInstance(){
if(null == wechat){
wechat = new Wechat();
}
return wechat;
}
public String getName() {
return name;
}
public void publishMessage(MessageBean messageBean) {
System.out.println(messageBean.getName() + "发了一条消息:" + messageBean.getMessageInfo());
setChanged();
notifyObservers(messageBean);
}
}
/**
* @description:接受者
* @author: annecheng,2019-06-30 20:28
*/
public class Friend implements Observer{
private String firendName;
public Friend(String firendName) {
this.firendName = firendName;
}
//观察者 -- 异步通知
public void update(Observable o, Object arg) {
Wechat wechat = (Wechat) o;
MessageBean messageBean = (MessageBean) arg;
System.out.println("-----------------------");
System.out.println(firendName + "您好,\n" +
"您收到一个来自" + wechat.getName() + "的消息,请查看,消息内容如下:\n" +
messageBean.getMessageInfo() + "\n" +
"发送者" + messageBean.getName());
}
}
/**
* @description:消息体
* @author: annecheng,2019-06-30 20:26
*/
public class MessageBean {
private String name;
private String messageInfo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessageInfo() {
return messageInfo;
}
public void setMessageInfo(String messageInfo) {
this.messageInfo = messageInfo;
}
}
测试:
3.2 Guava
/**
* @description:Guava
* @author: annecheng,2019-06-30 20:47
*/
public class GuavaEvent {
@Subscribe
public void subscribe(String str){
System.out.println("执行subscribe方法,入参:" + str);
}
@Subscribe
public void subscribe2(Integer num) {
System.out.println("执行subscribe2方法,入参:" + num);
}
}
四、总结
优点:
1、观察者和被观察者之间建立了一个抽象的耦合。
2、支持广播通信
缺点:
1、观察者之间有过多的细节依赖,提高时间消耗及程序的复杂度。
2、使用要得当,要避免循环调用。
mq – 观察者模式的具体应用