场景
场景:
一:
(1)比如我们有一个目标对象,
一旦这个目标对象的状态改变了,
然后的话就去通知相关的对象,
我的状态改变了,数据也变化了。
(2) 我们基于jdk自带的组件实现观察者模式:Observable
二:
电商项目中,订单中心通知库存中心修改库存之后,库存中心通过调度中心去调用仓储中心时候,可以使用观察者模式,在库存中心中将修改的订单结果通知调度中心。
内容
- 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。
1.观察者模式
给主体(Subject)绑定一个观察者(ConcreteObserver),观察者可以获取到主体的状态变化(update)
1.1 类图
1.2 代码
public class ObserverPattern2 {
public static void main(String[] args) {
//给主体绑定一个观察者: 告诉主体:哪个观察者在观察你;
//往对象里面添加观察者需要继承jdk自带的加锁的Observable类
//1.创建主体对象:默认状态为0
Subject subject = new Subject(0);
//2.注册/绑定一个观察者
Observer observer = new ObserverPattern.ConcretObserver();
subject.addObserver(observer);
//3.主体变化,监听变化
subject.setState(1);
}
public static class ConcreteObserver implements Observer{
public void update(Observable observable, Object o) {
Subject subject = (Subject) o;
Integer state = subject.getState();
System.out.println("观察者:目标对象的状态变化成:" + state);
}
}
public static class Subject extends Observable{
private Integer state;
public Subject(Integer state){
this.state = state;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
//在这里状态发生改变
this.state=state;
//通知关联的一些观察者,说我的状态变化了
this.setChanged();
//this.notifyObservers(state);//此处通知ConcreteObserver
this.notifyObservers(this);//此处通知ConcreteObserver
}
}
}
2.总结
优点:1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点:1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。