前言
观察者模式定义了多个对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并被自动更新。这种模式又称发布-订阅模式、模型-视图模式,是一种对象行为型模式。
观察者模式中的四种角色:
- 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
- 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
- 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
- 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
本节,我们就观察者模式展开详细介绍。
1. 定义观察者抽象接口
package com.wanlong.design_pattern.action.observer;
public interface Observer{
//更新方法
public void update(String msg);
}
2. 定义具体观察者
2.1 定义具体观察者1
package com.wanlong.design_pattern.action.observer;
/**
* @author wanlong
* @version 1.0
* @description:
* @date 2022/9/20 19:20
*/
public class ConcreteObserver implements Observer {
@Override
public void update(String msg) {
System.out.println("观察者1收到消息:"+msg+".....开始发货");
}
}
2.2 定义具体观察者2
package com.wanlong.design_pattern.action.observer;
/**
* @author wanlong
* @version 1.0
* @description:
* @date 2022/9/20 19:20
*/
public class ConcreteObserver2 implements Observer {
@Override
public void update(String msg) {
System.out.println("观察者2收到消息:"+msg+".....开始对账");
}
}
3. 定义抽象主题
package com.wanlong.design_pattern.action.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author wanlong
* @version 1.0
* @description: 抽象主题,维护观察者列表
* @date 2022/9/20 19:19
*/
public abstract class Subject {
//定义一个观察者数组
private List<Observer> obsList = new ArrayList<Observer>();
//增加一个观察者
public void addObserver(Observer obs) {
this.obsList.add(obs);
}
//删除一个观察者
public void delObserver(Observer obs) {
this.obsList.remove(obs);
}
//通知所有观察者
public void notifyObservers(String msg) {
for (Observer obs : this.obsList) {
obs.update(msg);
}
}
}
4. 定义具体主题
package com.wanlong.design_pattern.action.observer;
/**
* @author wanlong
* @version 1.0
* @description: 具体业务主题,某一类业务主题,继承抽象主题
* @date 2022/9/20 19:19
*/
public class ConcreteSubject extends Subject {
//具体的业务
public void doSomething(){
/*
do something 业务逻辑
*/
String msg="付款了";
//通知所有观察者付款了
super.notifyObservers(msg);
}
}
5. 客户端调用通知观察者
package com.wanlong.design_pattern.action.observer;
import org.junit.Test;
/**
* @author wanlong
* @version 1.0
* @description:
* @date 2022/9/20 19:22
*/
public class Client {
@Test
public void testObserver() {
ConcreteSubject subject = new ConcreteSubject();
//添加观察者,后续其他业务想监听消息,只需要维护新的观察者
subject.addObserver(new ConcreteObserver());
subject.addObserver(new ConcreteObserver2());
//具体主题业务逻辑,在业务逻辑最后,通知观察者
subject.doSomething();
}
}
//观察者1收到消息:付款了.....开始发货
//观察者2收到消息:付款了.....开始对账
6. 总结
观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应。解耦了观察者和目标之间的关系。
JAVASE提供了java.util.Observable和java.util.Observer来实现观察者模式文章来源:https://www.toymoban.com/news/detail-439588.html
6.1 优缺点
6.1.1 优点
- 降低了目标与观察者间的耦合关系,两者间是松耦合的,符合依赖倒置原则。
- 目标与观察者间建立了一套触发机制。
6.1.2 缺点
- 目标与观察者间的依赖关系并没有完全解除,而且可能出现循环引用
- 当观察者对象很多时,通知的发布会花费较多的时间,影响程序的效率
6.2 使用场景
- 聊天室群发消息
- 邮件订阅
- Servlet中,监听器的实现
- 消息队列是经典的观察者模式应用
以上,本人菜鸟一枚,如有问题,请不吝指正。文章来源地址https://www.toymoban.com/news/detail-439588.html
到了这里,关于6.设计模式之观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!