我有一个小程序,它会在文本更改后自行重新绘制
设计 1:
//MyApplet.java
public class MyApplet extends Applet implements Listener{
private DynamicText text = null;
public void init(){
text = new DynamicText("Welcome");
}
public void paint(Graphics g){
g.drawString(text.getText(), 50, 30);
}
//implement Listener update() method
public void update(){
repaint();
}
}
//DynamicText.java
public class DynamicText implements Publisher{
// implements Publisher interface methods
//notify listeners whenever text changes
}
这是否违反了单一职责原则 (SRP),因为我的 Applet 不仅充当 Applet,还必须做 Listener 工作。同样,DynamicText 类不仅会生成动态文本,还会更新已注册的监听器。
设计 2:
//MyApplet.java
public class MyApplet extends Applet{
private AppletListener appLstnr = null;
public void init(){
appLstnr = new AppletListener(this);
// applet stuff
}
}
// AppletListener.java
public class AppletListener implements Listener{
private Applet applet = null;
public AppletListener(Applet applet){
this.applet = applet;
}
public void update(){
this.applet.repaint();
}
}
// DynamicText
public class DynamicText{
private TextPublisher textPblshr = null;
public DynamicText(TextPublisher txtPblshr){
this.textPblshr = txtPblshr;
}
// call textPblshr.notifyListeners whenever text changes
}
public class TextPublisher implments Publisher{
// implements publisher interface methods
}
Q1.设计 1 是否违反 SRP?
Q2. 组合是否是消除设计 2 中 SRP 违规的更好选择。
最佳答案
Q1:是的。
Q2:是的。
我自己的问题:这是某种让人们使用更好的设计技术的投票吗?
无论如何。您正在做的是认识到您的问题中也存在中介者模式。这很微妙。现在,它看起来像是一个适配器,但随着您的设计的发展,我怀疑它实际上是一个调解器会变得很清楚。 Mediator 存在很多 UI 问题。如此之多,事实上,人们已经给调和 UI 问题中存在的中介力量起了一个特殊的名字:“MVC”。
关于java - 观察者模式与单一职责原则的违背,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2879215/