观察者模式与违反单一责任原则

时间:2010-05-21 02:22:50

标签: 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,而且还必须执行监听器工作。同样,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违规。

2 个答案:

答案 0 :(得分:1)

Q1:是的。

Q2:是的。

我自己的问题:这是一种推动民意调查,让人们使用更好的设计技巧吗?

反正。你正在做的是认识到你的问题中还有一个Mediator模式。这很微妙。现在,看起来它可能是一个适配器但是,随着你的设计的增长,我怀疑这将是一个真正的调解员。 Mediator存在很多UI问题。事实上,很多人已经将在UI问题中出现的Mediator部队调和为一个特殊名称:“MVC。”

答案 1 :(得分:0)

我没有看到设计1 的SPR问题,因为它是。在MVC中,视图应该监听模型,在这种情况下,视图是applet,发布者是模型。

现在好了,小程序还有一些其他的职责(生命周期管理让人想起),这可能意味着你想要在开始处理它们时分离出特定的视图类。然后,applet可以按组合使用视图。