版权声明:本文为「简简单单 Online zuozuo」原创文章,非商业用途欢迎转载,请保持署名,注明出处! Java 交流QQ 群:172083832 ,欢迎大家加入! https://blog.csdn.net/qq_15071263/article/details/85562241
文章目录
Java中的设计模式 - 观察者模式【又叫:发布/订阅模式】
1、观察者模式是为了解决什么问题
当我们在定义对象间的一种一对多的依赖关系,一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。所以使用观察者模式
2、核心逻辑
在抽象类中有一个注册观察者的List 对象
3、优点
1、观察者与被观察者是抽象耦合的
2、存在触发机制
4、缺点
1、如果某个被观察对象,拥有很多的观察者,则全部通知到会花费较多的时间
2、观察者与被观察者之间有可能存在循环依赖,导致系统宕机
3、观察者对于被观察者来说,是一个相对的黑箱,观察者只知道结果是这样,但是并不知道究竟是怎么变成这样的。
5、应用场景
1、发布/订阅
2、一个对象的状态变更,会影响到与他关联的对象
3、链式传递,一个对象的变更,会影响到与他关联的对象,而这个状态导致的关联变更,又会影响到关联对象的关联对象,那么可以设计一个链式观察模式来传递变更
6、构建观察者抽象类,抽离观察者属性
public abstract class Observer {
protected Subject subject;
public abstract void whileUpdate();
}
7、构建被观察者,主题
@Getter
public class Subject {
private List<Observer> observers = Lists.newArrayList();
private Object data;
public void whileDataUpdated(Object data) {
this.data = data;
notifyAllObserbers();
}
/**
* 新增一个观察者
*/
public void newObserver(Observer observer) {
observers.add(observer);
}
/**
* 通知所以的观察者
*/
public void notifyAllObserbers() {
observers.forEach(Observer::whileUpdate);
}
}
8、创建3个观察者 A B C
public class ObserverA extends Observer {
public ObserverA(Subject subject) {
this.subject = subject;
this.subject.newObserver(this);
}
@Override
public void whileUpdate() {
System.out.println("我是A观察者,我监听到变化:" + subject.getData().toString());
}
}
public class ObserverB extends Observer {
public ObserverB(Subject subject) {
this.subject = subject;
this.subject.newObserver(this);
}
@Override
public void whileUpdate() {
System.out.println("我是B观察者,我监听到变化:" + subject.getData().toString());
}
}
public class ObserverC extends Observer {
public ObserverC(Subject subject) {
this.subject = subject;
this.subject.newObserver(this);
}
@Override
public void whileUpdate() {
System.out.println("我是C观察者,我监听到变化:" + subject.getData().toString());
}
}
9、测试
public class Main {
public static void main(String[] args) {
Subject subject = new Subject();
new ObserverA(subject);
new ObserverB(subject);
new ObserverC(subject);
subject.whileDataUpdated("我注册了一张银行卡");
subject.whileDataUpdated("我注销了一张银行卡");
}
}
10、输出
我是A观察者,我监听到变化:我注册了一张银行卡
我是B观察者,我监听到变化:我注册了一张银行卡
我是C观察者,我监听到变化:我注册了一张银行卡
我是A观察者,我监听到变化:我注销了一张银行卡
我是B观察者,我监听到变化:我注销了一张银行卡
我是C观察者,我监听到变化:我注销了一张银行卡