java - 观察者模式与单一职责原则的违背

标签 java design-patterns oop

我有一个小程序,它会在文本更改后自行重新绘制

设计 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/

相关文章:

java - 我在 Android Studio 上以 XML 形式实现了卡片 View 。我怎样才能把它当作按钮呢?

python - SQLAlchemy声明式: How to merge models and existing business logic classes

java - 我应该传递一个单例作为函数参数吗

c# - 如何在 C# 中实现外观模式并物理隐藏子系统

c# - 面向组件的设计 : Problems with dependencies in dialogs

c# - 为什么 System.Windows.Forms.Control 没有标记为可序列化?

java - 如何获取 Access-Token 和 Access-Token-Secret?

Java FX 绑定(bind)属性问题

java - JSP 中未封闭的字符串文字错误?

python - 在python中对象实例化之前将方法传递给函数