简介
观察者模式定义:定义对象之间的一对多依赖,让多个观察者对象同时监听某一主题对象,当主题对象发生变化时,它的所有依赖着都会受到通知并更新。观察者模式属于行为型模式。
其实很好理解,就是类似我们平常微博,B站的关注一样,当被关注者发送新动态时,所有的关注该用户的人都会收到通知。
观察者模式结构
主题接口:定义主题对象需要实现的方法,一般要包括三个方法,分别为注册观察者,删除观察者,状态改变通知观察者。
具体主题接口:需要实现主题接口中的方法,主要需要实现状态改变通知观察者方法。
观察者接口:需要提供观察者更新方法,在订阅的主题对象状态发生改变时触发,观察者使用该接口接受主题对象状态更新
观察者具体实现:实现观察者,需要实现观察者接口中的更新方法。
案例
以消息订阅为例,有一个发布者和多个订阅者,订阅者可以取消或者订阅一个发布者,订阅了该发布者后,只要发布者更新动态,所有订阅者都会收到一条发布者更新动态的消息。
主题接口
//主题接口
public interface UP {
//订阅
public void subscribe(Subscriber subscriber);
//取消订阅
public void undoSubscribe(Subscriber subscriber);
//通知所有订阅者更新
public void notifySubscribe();
}
观察者接口
public interface Subscriber {
//订阅更新接口
void update(String msg);
}
主题类
//假设一类UP主
public class VideoUp implements UP{
private List<Subscriber>subscribers=new ArrayList<>();
//动态文本
private String message;
@Override
public void subscribe(Subscriber subscriber) {
subscribers.add(subscriber);
}
@Override
public void undoSubscribe(Subscriber subscriber) {
subscribers.remove(subscriber);
}
@Override
public void notifySubscribe() {
for(Subscriber subscriber:subscribers){
subscriber.update(message);
}
}
//主题更新,发送消息
public void messageUpdate(String message)
{
this.message=message;
notifySubscribe();
}
}
观察者类
public class Subscriber1 implements Subscriber{
private UP up;
public Subscriber1(UP up) {
this.up = up;
up.subscribe(this);
}
@Override
public void update(String msg) {
System.out.println("你关注的UP更新了动态:"+msg);
}
}
public class Subscriber2 implements Subscriber{
private UP up;
public Subscriber2(UP up) {
this.up = up;
up.subscribe(this);
}
@Override
public void update(String msg) {
System.out.println("你订阅的UP更新了动态:"+msg);
}
}
测试
@Test
public void test()
{
VideoUp videoUp = new VideoUp();
Subscriber1 subscriber1 = new Subscriber1(videoUp);
Subscriber2 subscriber2 = new Subscriber2(videoUp);
videoUp.messageUpdate("重生之我是奥特曼");
System.out.println("二号订阅者退订");
videoUp.undoSubscribe(subscriber2);
videoUp.messageUpdate("青春猪头少年不会梦到兔女郎");
}
测试结果
你关注的UP更新了动态:重生之我是奥特曼
你订阅的UP更新了动态:重生之我是奥特曼
二号订阅者退订
你关注的UP更新了动态:青春猪头少年不会梦到兔女郎