Java设计模式之观察者模式
前言
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己!
观察者模式在业务层面上分推模型和拉模型,下面分别通过具体的例子来讲解这2中类型。
推模型
被观察者对象向观察者推送被观察者的详细信息,不管观察者是否需要,推送的信息通常是被观察者对象的全部或部分数据。
首先创建个被观察者
public class Observerable {
List<IObserver> observers = new ArrayList<>();
public boolean addObserver(IObserver observer) {
return observers.add(observer);
}
public boolean removeObserver(IObserver observer) {
return observers.remove(observer);
}
public void change(String msg) {
for (IObserver iObserver : observers) {
iObserver.notify(msg);
}
}
}
接着创建个观察者接口让具体观察者去继承
public interface IObserver {
void notify(String msg);
}
具体的观察者类
public class ObserverImpl implements IObserver {
private String name;
public ObserverImpl(String name) {
this.name = name;
}
@Override
public void notify(String msg) {
System.out.println("name:" + this.name + " my receive msg la!");
}
}
测试 (创建5个观察者实例,一个被观察者实例)
public class Main {
public static void main(String[] args) {
// create observerable
Observerable observerable = new Observerable();
for (int i = 0; i < 5; i++) {
IObserver observer = new ObserverImpl("jack" + i);
observerable.addObserver(observer);
}
observerable.change("my is change...");
}
}
拉模型
如果观察者需要更具体的信息,由观察者主动到被观察者对象中获取,相当于是观察者从被观察者对象中拉数据。一般这种模型的实现中,会把被观察者对象自身通过update()方法传递给观察者。
public interface IObserver {
void notify(Observerable observerable);
}
接着创建具体的观察者类
public class ObserverImpl implements IObserver {
private String name;
public ObserverImpl(String name) {
this.name = name;
}
@Override
public void notify(Observerable observerable) {
Observerable observerable1 = observerable;
System.out.println("name:" + this.name + " my receive msg la! observerable name: " + observerable1.getName());
}
}
创建一个被观察者类
public class Observerable {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
List<IObserver> observers = new ArrayList<>();
public boolean addObserver(IObserver observer) {
return observers.add(observer);
}
public boolean removeObserver(IObserver observer) {
return observers.remove(observer);
}
public void change(String msg) {
for (IObserver iObserver : observers) {
iObserver.notify(this);
}
}
}
测试用例
public class Main {
public static void main(String[] args) {
// create observerable
Observerable observerable = new Observerable();
observerable.setName("jack");
observerable.setAge(100);
for (int i = 0; i < 5; i++) {
IObserver observer = new ObserverImpl("jack" + i);
observerable.addObserver(observer);
}
observerable.change("my is change...");
}
}
总结
观察者模式在实际开发中还是用的比较多的,比如我们很熟悉的EventBus(如果你还不了解的化,欢迎查看EventBus 使用方法及源码分析
)库就是采用观察者模式来实现总体的逻辑。再有Java的java.util库里面,提供了一个Observable类以及一个Observer接口,构成JAVA语言对观察者模式的支持。