Java - 对于这种情况,正确的设计/设计模式是什么?

标签 java design-patterns

我必须监听来自事件发射类的事件;例如点击。当前我有一个类可以处理来自事件发射类的事件,如下所示。

someclass.clickedOnItem1()
someclass.clickedOnItem2()

某个类在哪里

class Someclass {
   //functions clickedOnItem1() and clickedOnItem2()
}

请注意,Someclass 没有实现接口(interface)。我的问题是,我只希望 Someclass 的某些子类具有此行为,并且有能力覆盖该行为,但在类 Someclass 中也有一些默认行为。 Someclass 的默认行为取决于仅在某些子类中可用的特定行为。我正在考虑组合,其中每个子类都可以提供处理单击事件的接口(interface)的自定义实现。我目前正在寻求有关可以解决此问题的最佳设计模式的建议。

最佳答案

这不会回答什么设计模式问题,而只是考虑OOP概念:您可以在SomeClass中使用抽象,并且:

  • 声明抽象方法以从具体类获取细节
  • 将入口点(事件处理)方法设为 SomeClass 中的 final方法,以根据子类提供的特定配置卡住决策。这对于防止子类跳过您想要在父类(super class)中控制的逻辑非常重要。

SomeClass 可以如下所示:

abstract class Someclass {
    final void clickedOnItem1(){
        if(this.getConcreteOption()) {
             //do if concreteOption
        }

        this.performClickOnItem1Action();
    }

    void performClickOnItem1Action() {

    }

    abstract boolean getConcreteOption();
}

这将强制子类提供特定的配置,保持对父类(super class)中流程的控制,同时允许具体类覆盖行为。

子类可以如下所示:

class SomeclassA {
    void performClickOnItem1Action() {
        //overriding this...
    }

    boolean getConcreteOption() {
        return true;//or false
    }
}

class SomeclassB {
    boolean getConcreteOption() {
        return true;//or false
    }
}

关于Java - 对于这种情况,正确的设计/设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50831168/

相关文章:

javascript - 为什么只说 CommonJS 适用于非浏览器应用?

java - 从 SOAP xml 解码,getSOAPBody() 方法返回 Null

java - 安卓 ffmpeg : Path with spaces

java - 字符串、字符串生成器、字符数组和 Arraylist 之间的区别

design-patterns - 为什么STL中没有 "Iterable"接口(interface)?

JavaScript 模块模式 : which notation is preferred?

java - 为什么我会多次获取数据?

java - Spring Batch 中的作业被执行多次并且不会停止

design-patterns - 寻找能够处理不同平台/版本的测试模式/方法

JavaScript 设计模式