一句话总结观察者模式
- 找人看着一件事,有情况就通知你
什么是观察者模式?
- 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
应用场景小案例
-
一家车店丢了一台车,却不知道被谁偷了,这台车的损失只能由店主自己承担,为了避免这样的损失,他只能在店里安装监控警报,这样,谁在来偷车,警报便会报警,告诉店主有人来偷车,他就可以拎着棍子下来抓小偷。
-
总结: 设立一个观察角色(监控),时时刻刻盯着一个对象(车),当这个对象发生改变时便会告知设立方(店主),设立方便会做出相应的处理。
实现案例
- 被观察者
/**
* 被观察者(车)
*
* @author ext.liuyan10
* @date 2021/2/5 15:53
*/
public class Car extends Observable {
/**
* 车位状态(0在位 1被盗)
*/
private Integer type;
/**
* 车位状态改变
* @param type 车位状态
*/
public void setType(Integer type) {
this.type = type;
System.out.println("车位状态改变");
//通知观察者
setChanged();
//发送车位消息
notifyObservers(type);
}
}
- 观察者
/**
* 观察者(店主)
*
* @author ext.liuyan10
* @date 2021/2/5 16:01
*/
public class CarConcreteObserver implements Observer {
public CarConcreteObserver() {
}
/**
* 接收报警信息
*/
@Override
public void update(Observable o, Object arg) {
if(arg instanceof Integer){
if (0 == (Integer) arg){
System.out.println("车还在");
}
else {
System.out.println("车不在了拿棍子");
}
}
}
- 调用案例
/**
* @author ext.liuyan10
* @date 2021/2/5 16:09
*/
public class ObserverApp {
public static void main(String[] args) {
//创建被观察对象
Car car = new Car();
car.setType(1);
System.out.println("没装监控不知道");
//创建观察者
CarConcreteObserver carConcreteObserver = new CarConcreteObserver();
car.addObserver(carConcreteObserver);
car.setType(0);
car.setType(1);
}
}
*打印结果
Connected to the target VM, address: '127.0.0.1:53160', transport: 'socket'
车位状态改变
没装监控不知道
车位状态改变
车还在
车位状态改变
车不在了拿棍子
Disconnected from the target VM, address: '127.0.0.1:53160', transport: 'socket'
Process finished with exit code 0
网友评论