我只是从this link的观察者设计模式中读取了此示例代码。但是,谁能解释setState方法(不询问Subject类)是否在做两件事(设置state并通知observers)?

如果是,则方法setState是否违反单一责任原则(SRP)?

如果否,那么我们如何才能正确理解SRP?先感谢您。

我也遵循this topic,但找不到正确的答案。

public class Subject {
   private List<Observer> observers = new ArrayList<Observer>();
   private int state;

   public void setState(int state) {
     this.state = state;
     notifyAllObservers();
   }

   public void notifyAllObservers(){
     for (Observer observer : observers) {
        observer.update();
     }
   }

   // [...omitted other unrelated methods...]
}

最佳答案

问题明确地是关于方法“ setState”是否做两件事。答案是不。

引用第36页的“清洁代码”:


  如果某个功能仅执行比该功能的说明名称低一级的那些步骤,则该功能正在执行一件事。毕竟,我们编写函数的原因是在下一个抽象级别将更大的概念(换句话说,函数的名称)分解为一组步骤。 ...因此,另一种了解功能在做“一件事情”以外的事情的方法是,如果您可以从中提取另一个功能,而其名称不只是重述其实现。


困难在于名称“ setState(int state)”建议该函数设置状态(使用this.state = state;),然后调用另一个函数,执行2件事。

public void setState(int state) {
 this.state = state;
 notifyAllObservers();


}

但是,如果我们将函数重命名为processChange(),则很明显,该函数包括2个步骤(1.设置状态和2.通知观察者,即“上一引文中的下一个抽象层次)。

public void processChange(int state) {
 this.state = state;
 notifyAllObservers();


}

07-26 04:08