Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类设计方法中的继承与钩子_Java_Oop_Inheritance_Design Patterns_Abstract Class - Fatal编程技术网

Java 抽象类设计方法中的继承与钩子

Java 抽象类设计方法中的继承与钩子,java,oop,inheritance,design-patterns,abstract-class,Java,Oop,Inheritance,Design Patterns,Abstract Class,我正在重构一段包含大量if/else分支的代码。 我正在使用建议的策略模式,并创建了一系列类来实现if分支中的功能。 对此,我发现在一些情况下,代码在实际执行实际工作之前会做一些“额外”工作,因此现在我想做出最明智的设计决策: 1) 有以下几点: public abstract class Processor { private abstract void mainProcess(Object o); protected void preProcess(Object o) {}

我正在重构一段包含大量if/else分支的代码。
我正在使用建议的策略模式,并创建了一系列类来实现if分支中的功能。
对此,我发现在一些情况下,代码在实际执行实际工作之前会做一些“额外”工作,因此现在我想做出最明智的设计决策:
1) 有以下几点:

public abstract class Processor {
    private abstract void mainProcess(Object o);
    protected void preProcess(Object o) {}
    public void process(Object o) {
       preProcess(o);  
       mainProcess(o);
    }
}
很少有类会用特定的逻辑重写和预处理,而其余的只是一个“空”钩子

2) 有类似于:

public interface Processor {
   public void process(Object o);
}

    public class XProcessor implements Processor {
       @Override
       public void process(Object o) {
          //code here
       }
    }

    public class SpecialCaseProcessor extends XProcessor {
       private void preProcess(Object o) {
        //code here
       }

       @Override
       public void process(Object o) {
          preProcess(o);
          super.process(o);
       }
    }
老实说,我有点喜欢(1),但我不喜欢这样,30个类中只有5个真正实现了预处理

在(2)中,我避免使用空钩子,但是我需要在“构造函数/工厂”中找到一种方法来区分特定的扩展子类


什么是最明智/最具可读性的方法?

我想你可以有这样的方法-

1)
处理器
接口

2)
AbstractProcessor
抽象类,它实现了
处理器
,并具有
预处理
抽象方法

3) 让您的非特殊情况处理器实现
处理器
,特殊情况处理器扩展
抽象处理器


我认为这样可以避免空钩子,并且仍然可以区分特定的类

@GriffeyDog:你说得对。我更正了OP,以显示我的想法:在这种情况下,如果你对它们所做的一切都是直接从
process
后面调用另一个,那么为什么有
preProcess
mainProcess
。在某些情况下,我需要在实际主处理之前进行预处理,而在其他情况下,为什么不关闭?如果没有“强制执行”配方,您可以在需要它的处理器中实现配方(作为私有实现细节),如案例2),但不需要继承链,至少留下一条评论。