简述:Java的观察者模式是一种设计模式,它定义了一种对象间的一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够得到收到消息通知。在这种模式中,被观察者维护了一个观察者列表,并提供了添加、删除和通知观察者的方法。
目录
一、什么是观察者模式
二、观察者模式使用场景
三、观察者与被观察者直观的关系图
四、完整代码示例,方便理解
1、首先定义被观察者接口类Observable:
2、观察者接口实现类:
3、再定义观察者接口类Observer:
4、再定义观察者接口实现类MyObserver:
5、主播开播发送通知消息演示:
一、什么是观察者模式
观察者先订阅被观察者对象,当被观察者行为发生改变时,观察者就能及时收到消息通知。
二、观察者模式使用场景
一个对象需要将自己的状态改变通知给其它多个对象,一个对象与它的多个依赖对象需要解耦,以便能对其修改,但不会对其它对象产生影响。
三、观察者与被观察者直观的关系图
举例:张三(观察者1)、李四(观察者2)、张三(观察者1)在抖音上关注了某个美女主播,当美女主播开播时,他们的粉丝能收到开播的消息推送。在直播间里的这些观察者,可以观察到美女行为变化(如:跳舞、唱歌表演)。
四、完整代码示例,方便理解
以下是一个Java观察者模式的示例代码:
1、首先定义被观察者接口类Observable:
/**
* 被观察者
*/
public interface Observable {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void sendMessage(String message);
}
2、观察者接口实现类:
内含有:观察者列表,并提供了添加、删除和通知观察者的实现方法
/**
* 被观察者实现类
*/
public class MyObservable implements Observable {
private static volatile MyObservable instance = null;
private MyObservable() {
}
public static MyObservable getInstance() {
if (instance == null) {
synchronized (MyObserver.class) {
if (instance == null) {
instance = new MyObservable();
}
}
}
return instance;
}
//维护的观察者列表
private List<Observer> mObservers = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
mObservers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
mObservers.remove(observer);
}
@Override
public void sendMessage(String message) {
notifyObserver(message);
}
/**
* 通知所有观察着
*
* @param message
*/
private void notifyObserver(String message) {
for (Observer observer : mObservers) {
observer.receiveMessage(message);
}
}
}
3、再定义观察者接口类Observer:
/**
* 观察者
*/
public interface Observer {
void receiveMessage(String message);
}
4、再定义观察者接口实现类MyObserver:
/**
* 观察则实现类
*/
public class MyObserver implements Observer {
private String key;
private ObserverListener mObserverListener;
public MyObserver(String key, ObserverListener observerListener) {
this.key = key;
this.mObserverListener = observerListener;
}
@Override
public void receiveMessage(String message) {
if (mObserverListener != null) {
System.out.println( key + "---------接收到消息:《" + message+"》");
mObserverListener.receive(message);
}
}
public interface ObserverListener {
void receive(String message);
}
}
5、主播开播发送通知消息演示:
/**
* 演示代码
*/
public class Main {
public static void main(String[] args) {
//粉丝1订阅
MyObserver observer1=new MyObserver("粉丝-老林", message -> {
//这里进行消息处理
});
//粉丝2订阅
MyObserver observer2=new MyObserver("粉丝-老王", message -> {
//这里进行消息处理
});
//加入观察者列表
MyObservable.getInstance().addObserver(observer1);
MyObservable.getInstance().addObserver(observer2);
//通知所有订阅的观察者
MyObservable.getInstance().sendMessage("大家好,菲儿已开播了,赶快来我直播间吧!");
}
}
各位看官,麻烦点个赞,感谢 !!!