Java开闭原理设计

Posted

技术标签:

【中文标题】Java开闭原理设计【英文标题】:Java open closed principle design 【发布时间】:2015-10-25 15:40:27 【问题描述】:

我正在准备面向对象建模和设计的考试,但无法解决这个问题。

设计违反了开闭原则;你不能在不修改类的情况下添加更多的 JButton。重做设计,使之成为可能。设计应包含三个按钮和事件管理。避免重复代码。用类图展示新设计。

//other code
private Application application;
private JButton b1, b2, b3;
class ActionHandler implements ActionListener 
    public void actionPerformed(ActionEvent e) 
        if (e.getSource() == b1) 
            application.action1();
         else if (e.getSource() == b2) 
            application.action2();
         else 
            application.action3();
        
    

【问题讨论】:

为每个按钮使用单独的监听器。 顺便说一句,我认为这不是开闭原则及其违反的一个特别好的例子。 【参考方案1】:

一种方法是将按钮保留在数据结构中。 在您的事件侦听器中,您可以遍历这些项目。 此外,您可以有一个添加按钮的方法。

例子:

private Application application;

private Map<JButton, Runnable> buttons = new LinkedHashMap<>();
public void addButton(JButton button, Runnable handler)
    buttons.put(button, handler);

class ActionHandler implements ActionListener 
    public void actionPerformed(ActionEvent e) 
        // either iterate:
        for(Map.Entry<JButton, Runnable> entry : buttons.entrySet())
            if(e.getSource()==entry.getKey())
                entry.getValue().run();
                break;
            
        

        // or (more efficient) access directly:
        Runnable handler = buttons.get(e.getTarget());
        if(handler!=null)handler.run();
    

【讨论】:

以上是关于Java开闭原理设计的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶专题: 软件架构设计原则

带构造函数的开闭原理

开闭原则原理

开闭原理及扩展功能

针对不同过滤条件的开闭原理

C#软件设计——小话设计模式原则之:开闭原则OCP