一.观察者模式
观察者模式:对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,观察者对象收到通知并更新
二.观察者模式-示例朋友圈关注-JDK实现
当我们设置关注某一个人时,ta的朋友圈更新,我们也会收到消息提醒
1.新建一个朋友圈消息类
// 朋友圈消息
public class WechatMessage {
// 发朋友圈的名字
private String name;
// 发朋友圈的内容
private String content;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
2.新建一个WeChat类继承Observable (jdk中的类用于实现观察者模式,其作用为注册观察者,唤醒观察者)
public class WeChat extends Observable {
private String name = "朋友圈";
private static WeChat weChat = new WeChat();
private WeChat(){}
public static WeChat getInstance(){
return weChat;
}
public void publishMsg(WechatMessage wechatMessage){
System.out.println(wechatMessage.getName()+"在"+this.name+"发布了一条朋友圈...");
// 标记被观察者的改变
setChanged();
// 通知观察者,传入消息内容
notifyObservers(wechatMessage);
}
}
3.新建一个Watcher类实现Observer接口(jdk中,其作用为:当通知观察者时,观察者需要做的更新操作是什么)
public class Watcher implements Observer {
private String name;
public Watcher(String name) {
this.name = name;
}
// 接受到消息通知内容
@Override
public void update(Observable o, Object arg) {
// 被观察者
WeChat weChat = (WeChat) o;
// notifyObservers(wechatMessage) 中所传入的参数
WechatMessage wechatMessage = (WechatMessage) arg;
// 观察者,根据被观察者的状态做出相应的改变
System.out.println("=======================================");
System.out.println(this.name + ",你关注的" + wechatMessage.getName() + "发布了一条朋友圈,内容为:" + wechatMessage.getContent() + "-赶紧过去点赞!");
}
}
4.新建一测试类
public class Test {
public static void main(String[] args) {
WeChat weChat = WeChat.getInstance();
// 设置被观察对象小红发朋友圈
WechatMessage wechatMessage = new WechatMessage();
wechatMessage.setName("小红");
wechatMessage.setContent("哦,这该死的天气!");
// 观察者-小明
Watcher watcher = new Watcher("小明");
// 观察者-小王
Watcher watcher1 = new Watcher("小明");
// 加入观察者
weChat.addObserver(watcher);
weChat.addObserver(watcher1);
// 被观察对象发布朋友圈
weChat.publishMsg(wechatMessage);
}
}
5.测试结果
6.UML图
三.Guava实现事件监听
1.创建事件源,添加注解
public class GuavaEvent {
@Subscribe
public void subscribe(String msg){
System.out.println("发起调用:"+msg);
}
}
2.新建测试类-先创建事件总线,将事件注册到事件总线中,当发起调用时,会通知到注册到事件总线中的事件,完成调用
public class GTest {
public static void main(String[] args) {
// 事件总线
EventBus eventBus = new EventBus();
// 新建事件
GuavaEvent guavaEvent = new GuavaEvent();
// 注册事件
eventBus.register(guavaEvent);
// 发起调用
eventBus.post("message");
}
}
3.测试结果
四.观察者模式-示例朋友圈关注-Guava实现
1.新建一朋友圈消息类
// 朋友圈消息
public class WechatMessage {
// 发朋友圈的名字
private String name;
// 发朋友圈的内容
private String content;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
2.新建一WeChat继承EventBus
public class WeChat extends EventBus {
private String name = "朋友圈";
private static WeChat weChat = new WeChat();
private WeChat(){}
public static WeChat getInstance(){
return weChat;
}
public void publishMsg(WechatMessage wechatMessage){
System.out.println(wechatMessage.getName()+"在"+this.name+"发布了一条朋友圈...");
// 触发事件
this.post(wechatMessage);
}
}
3.新建一Watcher--只需要在事件被触发时,所回调的方法上加注解@Subscribe
public class Watcher {
private String name;
public Watcher(String name) {
this.name = name;
}
@Subscribe
public void watcherWechat(WechatMessage wechatMessage){
// 观察者,根据被观察者的状态做出相应的改变
System.out.println("=======================================");
System.out.println(this.name + ",你关注的" + wechatMessage.getName() + "发布了一条朋友圈,内容为:" + wechatMessage.getContent() + "-赶紧过去点赞!");
}
}
4.新建一测试类
public class Test {
public static void main(String[] args) {
WeChat eventBus = WeChat.getInstance();
Watcher guavaEvent = new Watcher("小明");
Watcher guavaEvent1 = new Watcher("小王");
// 注册事件
eventBus.register(guavaEvent);
eventBus.register(guavaEvent1);
WechatMessage wechatMessage = new WechatMessage();
wechatMessage.setName("小红");
wechatMessage.setContent("啊,这天气好热!");
// 发起事件
eventBus.publishMsg(wechatMessage);
}
}
5.测试结果
6.UML图
五.总结
观察者模式:流程为:新建事件->注册事件->新建消息->发起事件
通过传入的消息,去更新事件,当有多个对象去监听同一个消息时,那么多个监听对象会同步更新