设计模式—观察者模式
观察者模式
观察者模式(Observer Pattern) 也叫做发布订阅模式(Publish/subscribe) ,它是一个在项目中经常使用的模式。
定义对象间一种一对多的依赖关系, 使得每当一个对象改变状态, 则所有依赖于它的对象都会得到通知并被自动更新。
模式类型:观察者模式
优点
- 观察者和被观察者之间是抽象耦合
- 建立一套触发机制
缺点
观察者模式需要考虑一下开发效率和运行效率问题, 一个被观察者, 多个观察者, 开发和调试就会比较复杂, 而且在Java中消息的通知默认是顺序执行, 一个观察者卡壳, 会影响整体的执行效率。 在这种情况下, 一般考虑采用异步的方式。
使用场景
- 关联行为场景。 需要注意的是, 关联行为是可拆分的, 而不是“组合”关系。
- 事件多级触发场景。
- 跨系统的消息交换场景, 如消息队列的处理机制。
案例分析
- 观察者接口
/**
* @author admin
*/
public interface IObserver {
/**
* 前置操作
*/
void before();
/**
* 跟新操作
*/
void update();
/**
* 后置操作
*/
void after();
}
- 观察者实现
/**
* @author admin
*/
public class FirstObserver implements IObserver {
@Override
public void before() {
System.out.println("FirstObserver is doing before action.");
}
@Override
public void update() {
before();
System.out.println("FirstObserver is updating.");
after();
}
@Override
public void after() {
System.out.println("FirstObserver is doing after action.");
}
}
- 被观察者接口
/**
* @author admin
*/
public interface ISubject {
/**
* 增加观察者
*
* @param observer 观察者
* @return 是否成功
*/
boolean addObserver(IObserver observer);
/**
* 移除观察者
*
* @param observer 观察者
* @return 是否成功
*/
boolean removeObserver(IObserver observer);
/**
* 通知所有观察者
*/
void notifyAllObservers();
}
- 被观察者具体实现
/**
* 具体主题
*/
public class ConcreteSubject implements ISubject {
List<IObserver> list = new ArrayList<>();
@Override
public boolean addObserver(IObserver observer) {
list.add(observer);
return true;
}
@Override
public boolean removeObserver(IObserver observer) {
list.remove(observer);
return true;
}
@Override
public void notifyAllObservers() {
for (IObserver observer : list) {
observer.update();
}
}
}
- 客户端
/**
* @author admin
*/
public class Client {
public static void main(String[] args) {
ConcreteSubject concreteSubject = new ConcreteSubject();
concreteSubject.addObserver(new FirstObserver());
concreteSubject.notifyAllObservers();
}
}
- 执行结果
FirstObserver is doing before action.
FirstObserver is updating.
FirstObserver is doing after action.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!