这是我参与更文挑战的第6天,活动详情查看: 更文挑战
定义
定义对象之间 一种一对多的依赖关系,使得每当一个对象改变状态,则所有注册观察的都会得到通知,并且自动更新
举一个例子:掘金是一个技术论坛, 大家都关注我,然后我发布文章, 所有关注我的人都能得到收到我更新文章的提示,这就是一个简单的观察者例子,代码见下边实现
UML类图
- Subject(抽象主题): 也就是被观察者的角色
- JuejinSubject(具体主题): 是一个继承抽象主题的类,注册、解注册、处理观察者的变化
- Observe(观察者): 观察者是一个由对象水岸的接口,根据主题中的更改而进行更新。
- Coder (具体观察者): 该角色实现抽象观察者角色所定义的更新接口,以便在主题状态发生改变的时候更新自生的状态
代码实现
SubJect抽象一个主题 ,主要是注册、解注册、通知订阅者几个方法
public abstract class SubJect {
//注册订阅
void registerObserver(Observer observer) { }
//解注册订阅
void unRegisterObserver(Observer observer){}
//通知订阅者
void notifyObserver(String message){}
}
复制代码
JuejinSubject具体主题类,实现抽象主题的方法
public class JuejinSubject extends SubJect {
private List<Observer> observerList = new ArrayList<>(); //订阅者容器,Observer
@Override
public void registerObserver(Observer observer) {
if (!observerList.contains(observer)) {
observerList.add(observer); // 添加订阅关系
}
}
@Override
public void unRegisterObserver(Observer observer) {
if (observerList.contains(observer)) {
observerList.remove(observer); //移除订阅关系
}
}
@Override
public void notifyObserver(String message) {
for (Observer observer :
observerList) {
observer.notify(message); //通知
}
}
}
复制代码
Observer 抽象观察者,定义一个更新接口
public interface Observer {
void notify(String message);
}
复制代码
Coder具体观察者
class Coder implements Observer {
private String name;
public Coder(String name){
this.name = name;
}
@Override
public void notify(String message) {
System.out.println("hi " +name +" 您订阅的juejin主题更新啦,更新内容 " + message);
}
}
复制代码
Test测试类代码
public class Test {
public static void main(String[] args) {
JuejinSubject juejinSubject = new JuejinSubject(); //掘金被观察者对象
//程序员观察者
Coder coderA = new Coder("程序员A");
Coder coderB = new Coder("程序员B");
Coder coderC = new Coder("程序员C");
Coder coderD = new Coder("程序员D");
//注册观察
juejinSubject.registerObserver(coderA);
juejinSubject.registerObserver(coderB);
juejinSubject.registerObserver(coderC);
juejinSubject.registerObserver(coderD);
//通知观察者
juejinSubject.notifyObserver("丁大忽悠发布新文章啦,快来查看吧>_>");
}
}
复制代码
输出:
Android中著名的库 EventBus就是一个完成的观察者模式的例子.有时间分析给大家.
总结
观察者模式重要的作用就是对象接偶,将观察者与被观察者完全接偶,只依赖于Observer和Observable抽象.
合理的使用设计模式可以使代码结构更加清晰,同时还能满足不同的小模块符合单一职责,以及开闭原则,从而达到前面写工厂模式说的,提高代码的可扩展性,维护成本低的特点。
优点
- 观察者和被观察者之间是抽象耦合,应对业务变化
- 增强系统灵活性,可扩展
缺点
- 再应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者和多个观察者,代码量会比较多,开发和测试比较复杂.
以上就是观察者模式的全部内容,喜欢的话点个赞吧.
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END