摘要:观察者模式的使用场景比如你微博关注了一个人,那么这个人发布的微博就会推送到你这。
Java设计模式之观察者模式
一直想写一篇学习观察者模式的总结没有契机,今天学习阻塞队列的原理时候看到在实现生产者消费者的时候用到了通知模式,就是所谓的观察者模式,正好顺便整理一下。
1. 简介观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。也就是 发布-订阅 的模式。
观察者模式涉及到的参与者有:
Subject(目标):被观察者的接口,提供注册/删除观察者和发通知的方法;
Observer(观察者):观察目标的对象接口,提供目标发生改变时需要处理更新的方法;
ConcreteSubject(具体目标):实现被观察者接口的具体被观察者类,维护一个观察者的引用,在发通知的时候调用观察者的更新方法;
ConcreteObserver(具体观察者):实现观察者接口的具体观察者类。
观察者模式的使用场景比如你微博关注了一个人,那么这个人发布的微博就会推送到你这。
还比如你关注了一个微信公众号,这个公众号发布的文章也会推送到你这。
2. 实例代码就拿微博关注来举个例子,一些人关注了一个大V,那么大V每次发微博,这些人就会收到推送,哪天大V发的微博让某些人不爽了,果断取关,那么以后就不会收到大V的推送消息了。
新建Subject接口package con.wangjun.designPattern.observer;
public interface Subject {
public void addFans(Observer o); // 添加粉丝
public void removeFans(Observer o); // 移除粉丝
public void notifyFans(String str); // 通知粉丝
}
新建Observer接口
package con.wangjun.designPattern.observer;
public interface Observer {
// 当被观察者调用notifyFans发通知,update方法会被回调
public void update(String str);
}
新建Subject实现类
package con.wangjun.designPattern.observer;
import java.util.ArrayList;
import java.util.List;
public class VSubject implements Subject {
List list = new ArrayList<>();
// 发布微博
public void publish(String str) {
System.out.println("大V发布微博:" + str);
// 通知所有粉丝
notifyFans(str);
}
@Override
public void addFans(Observer o) {
list.add(o);
}
@Override
public void removeFans(Observer o) {
list.remove(o);
}
@Override
public void notifyFans(String str) {
for(int i = 0; i < list.size(); i++) {
list.get(i).update(str);
}
}
}
新建Observer实现类
package con.wangjun.designPattern.observer;
public class FansObserver implements Observer {
private String name;
public FansObserver(String name) {
this.name = name;
}
@Override
public void update(String str) {
System.out.println(name + " 收到大V的微博发文:" + str);
}
}
新建测试类
package con.wangjun.designPattern.observer;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
VSubject vs = new VSubject(); // 大V的实例
List fans = new ArrayList<>(); //存储所有粉丝
for(int i = 0; i < 5; i++) {
FansObserver f = new FansObserver("name" + (i + 1));
fans.add(f);
vs.addFans(f);
}
// 本次发微博,5个粉丝都收到推送
vs.publish("我的女朋友真好看!");
// 居然秀恩爱,前2个粉丝,看不下去了,取关!
for(int i = 0; i < 2; i++) {
vs.removeFans(fans.get(i));
}
//这次发微博,那两个取关的人就看不到了
vs.publish("我要送所有粉丝一部iPhone X");
}
}
运行结果
大V发布微博:我的女朋友真好看! name1 收到大V的微博发文:我的女朋友真好看! name2 收到大V的微博发文:我的女朋友真好看! name3 收到大V的微博发文:我的女朋友真好看! name4 收到大V的微博发文:我的女朋友真好看! name5 收到大V的微博发文:我的女朋友真好看! 大V发布微博:我要送所有粉丝一部iPhone X name3 收到大V的微博发文:我要送所有粉丝一部iPhone X name4 收到大V的微博发文:我要送所有粉丝一部iPhone X name5 收到大V的微博发文:我要送所有粉丝一部iPhone X
参考:《面向对象的设计模式》
JAVA设计模式之观察者模式https://www.cnblogs.com/luoha...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69623.html
摘要:三内置观察者模式了解内置观察者模式包内包含最基本的类与接口,这和上面的接口与接口很类似。根据具体的需求,如果内置的观察者模式不能满设计,那么我们可以像刚开始那样自己实现一套观察者模式。参考资料设计模式 一、了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。 典型的问题比如报社,只要你是他...
摘要:观察者模式也称发布订阅模式它的作用就是当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,自动刷新对象状态举个生活比较常见常见的例子比如你去面试之后,面试官看你表现不错,最后会跟你要联系方式,以便之后可以联系你。 观察者模式也称发布-订阅模式,它的作用就是当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,自动刷新对象状态 举个生活比较常见常见的例子,比如你去面试之后,...
摘要:关键概念理解观察者设计模式中主要区分两个概念观察者指观察者对象,也就是消息的订阅者被观察者指要观察的目标对象,也就是消息的发布者。 原文首发于微信公众号:jzman-blog,欢迎关注交流! 最近补一下设计模式相关的知识,关于观察者设计模式主要从以下几个方面来学习,具体如下: 什么是观察者设计模式 关键概念理解 通知观察者的方式 观察者模式的实现 观察者模式的优缺点 使用场景 下面...
本文从jdk内置的观察者模式来介绍观察者模式。业务场景:当老师进门的时候,班长带头叫老师好,然后全班同学一起交老师好因为太简单,直接上代码 班长继承自Observable package Observer; import java.util.Observable; import java.util.Observer; public class Monitor extends Observabl...
摘要:观察者模式,是一对多的关系,一个主题对应多个观察者,当这个主题发生变化的时候,所有观察着这个主题的观察者都会接收到通知来获悉主题的变化。这就是使用的观察者模式,下面就让我们用代码实现观察者模式。 观察者模式,是一对多的关系,一个主题对应多个观察者,当这个主题发生变化的时候,所有观察着这个主题的观察者都会接收到通知来获悉主题的变化。 在现实中我们也会遇到许许多多应用观察者模式的行为,比如...
阅读 1487·2019-08-30 15:44
阅读 2310·2019-08-30 13:49
阅读 1876·2019-08-26 13:54
阅读 3763·2019-08-26 10:20
阅读 3677·2019-08-23 17:18
阅读 3489·2019-08-23 17:05
阅读 2327·2019-08-23 15:38
阅读 1244·2019-08-23 14:35