设计模式(观察者模式)
第三章 设计模式之观察者模式
观察者模式介绍
观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有的依赖对象都会自动收到通知。一般情况下,被依赖的对象叫做被观察者(Observeable) ,依赖的对象叫作观察者(Observer) 。
不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不同的叫法,比如Subject-Observer、Publisher-Subscriber、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。不管怎么称呼,只要应用场景符合刚刚给出的定义,都可以看做观察者模式。
实际上,观察者模式是一个比较抽象的模式,根据不同的应用场景和需求,有完全不同的实现方式。下面讲到的是其中最经典的一种实现方式。
示例程序
Subject 被观察者接口
/**
* @author maomao
* @date 2025/1/10
* @time 16:10
* 被观察者接口
*/
public interface Subject {
/**
* 注册观察者
* @param observer 观察者
*/
void register(Observer observer);
/**
* 移除观察者
* @param observer 观察者
*/
void remove(Observer observer);
/**
* 通知观察者
* @param message 消息
*/
void notifyObserver(String message);
}
Observer 观察者接口
/**
* @author maomao
* @date 2025/1/10
* @time 16:11
* 观察者接口
*/
public interface Observer {
/**
* 观察者执行
* @param message 消息
*/
void execute(String message);
}
NotifySubject 被观察者实现类
/**
* @author maomao
* @date 2025/1/10
* @time 16:13
*/
public class NotifySubject implements Subject {
List<Observer> observers = new ArrayList<>();
@Override
public void register(Observer observer) {
observers.add(observer);
}
@Override
public void remove(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObserver(String message) {
for (Observer observer : observers) {
observer.execute(message);
}
}
}
SendMsgObserver
/**
* @author maomao
* @date 2025/1/10
* @time 16:13
*/
public class SendMsgObserver implements Observer {
@Override
public void execute(String message) {
System.out.println("发送短信,内容为:" + message);
}
}
CallObserver
/**
* @author maomao
* @date 2025/1/10
* @time 16:15
*/
public class CallObserver implements Observer {
@Override
public void execute(String message) {
System.out.println("打电话,内容为:" + message);
}
}
Main函数
/**
* @author maomao
* @date 2025/1/10
* @time 16:15
*/
public class Main {
public static void main(String[] args) {
NotifySubject notifySubject = new NotifySubject();
notifySubject.register(new SendMsgObserver());
notifySubject.register(new CallObserver());
notifySubject.notifyObserver("今天不上班,休假一天。");
}
}