吸毒者和二传手替代

时间:2016-12-18 13:42:18

标签: java getter-setter

我有一个MVC结构,我在JPanel类中设置JPanel的颜色。我想知道两种替代方案中哪一种是最佳解决方案。

  1. 通过将带有getter的方法转发到Panel-class
  2. 来设置Controller类中的颜色
  3. 使用setter设置Panel-class中的颜色,如替代方案2中所示。
  4. 备选方案2听起来对我来说是一个更好的解决方案,但不知道它是否有很大的不同,因为两者都在工作,所以如果是这样,为什么?

    非常感谢!

    替代方案1:

    控制器类

    在运行线程中:

    theView.getPanelClass().getPanel().setBackground(new Color(255));
    

    查看课程

    private final PanelClass panel = new PanelClass();
    
    public PanelClass getPanelClass() {
        return panel;
    }
    

    面板类(在视图中声明)

    JPanel thePanel = new JPanel();
    
    public JPanel getPanel() {
        return thePanel;
    }
    

    替代方案2:

    控制器类 在运行线程:

    theView.setPanel(new Color(255));
    

    查看课程

    private final PanelClass panel = new PanelClass();
    
    public void setPanel(Color col) {
       panel.setThePanel(col);
    }
    

    面板类(在视图中声明)

    JPanel thePanel = new JPanel();
    
    public void setThePanel(Color c) {
        thePanel.setBackground(c);
    }
    

    更新 我现在编辑了我的代码,如下所示,视图类通过JPanel类设置颜色。

    替代3:

    控制器类 在运行线程:

    if(x>y) {    
      theView.setPanel(1);
    } else {
      theView.setPanel(2);
    }
    

    查看课程

    private final PanelClass panel = new PanelClass();
    
    public void setPanel(int n) {
       panel.setThePanel(n);
    }
    

    面板类(在视图中声明)

    public void setThePanel(int n) {
        switch (n) {
            case 1:
                panelS1.setBackground(new Color(255));
                break;
            case 2:
                panelS1.setBackground(new Color(0));
                break;
        }
    }
    

2 个答案:

答案 0 :(得分:1)

这是合同决定。如果您同意开发人员有责任了解您的观点内部,并且在设置背景颜色之前他了解getPanelClass()getPanel()是可以接受的,那么解决方案(1)是可行的。

如果您认为期望程序员了解实施细节是侮辱性的,那么您最好选择(2)。

现在,可能有理由,但为什么要设置控制器的颜色?难道这不是一个纯粹由观点本身做出的决定吗?将视图与控制器分开的整个目的正是为了不干扰这种决定。如果您决定使用其他组件更新x年中的视图,您确定它还具有背景颜色设置器,该怎么办?如果是这样,请确保您当前的视图实现了一个" ViewWithBackgroundColorSetter"接口例如。

你知道我有点扩张,但你的问题比你想象的要深刻。

答案 1 :(得分:1)

第一种选择似乎违反了所谓的好莱坞原则。我宁愿选择第二种选择