观察者模式中setState方法是否违反单一职责原则(SRP)?
关于观察者模式中
setState与单一职责原则的解析 Hey there! Let's break this down clearly, using the standard observer pattern Subject implementation that aligns with your question.
1. 首先回答:setState是否同时执行设置状态和通知观察者?
是的,在绝大多数经典的观察者模式实现里,setState方法会完成两个连贯的操作:
- 首先更新Subject内部的状态值(比如
this.state = newState) - 紧接着调用
notifyObservers()方法,触发所有注册的观察者执行更新逻辑
举个完整的典型实现片段(补全你提到的代码框架):
public class Subject { private String state; private List<Observer> observers = new ArrayList<>(); public void setState(String state) { this.state = state; // 设置状态 notifyObservers(); // 通知观察者 } private void notifyObservers() { for (Observer observer : observers) { observer.update(state); } } // 注册/移除观察者的方法... }
2. 这种实现是否违反单一职责原则(SRP)?
完全不违反——这里的关键是要纠正对SRP的常见误解:
很多人误以为SRP是“一个类/方法只能做一件事”,但这是对SRP的片面解读。
SRP的核心定义是:一个类应该只有一个引起它变化的原因。换句话说,类的所有操作都应该服务于同一个核心职责,不会因为不同的业务需求而被拆分修改。
具体分析Subject的职责:
Subject的核心职责是作为状态的发布者:
- 它需要维护自身的状态(所以要有设置状态的逻辑)
- 它需要在状态变化时,确保所有订阅的观察者同步感知到变化(所以要有通知逻辑)
这两个操作都是状态发布者这个核心职责的必要组成部分——它们不会因为不同的原因被修改:
- 如果要修改状态的验证规则(比如不允许空值),我们只需要修改
setState里的状态更新逻辑 - 如果要修改通知的方式(比如异步通知、批量通知),我们只需要修改
notifyObservers的实现
这两种修改都是围绕“状态发布”这个单一职责的,所以Subject只有一个变化原因,完全符合SRP。
什么情况才会违反SRP?
如果我们在Subject里加入和“状态发布”无关的逻辑,比如:
// 错误示例:违反SRP public void setState(String state) { this.state = state; notifyObservers(); saveStateToDatabase(); // 新增持久化逻辑 }
这时候Subject就有两个变化原因了:
- 状态发布逻辑的变化(比如通知方式调整)
- 持久化逻辑的变化(比如数据库切换)
这种情况才真正违反了SRP。
3. 如何正确理解SRP?
记住几个关键点:
- SRP关注的是变化的原因,而非操作的数量
- 一个类/方法可以包含多个操作,只要这些操作都是服务于同一个核心职责
- 判断是否违反SRP的标准:如果修改某段逻辑时,不需要同时考虑另一段逻辑的影响,那么这两段逻辑属于不同的职责,应该拆分
内容的提问来源于stack exchange,提问作者hoan
相关产品推荐
相关产品推荐

