Java 抽象类设计方法中的继承与钩子
我正在重构一段包含大量if/else分支的代码。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分支中的功能。
对此,我发现在一些情况下,代码在实际执行实际工作之前会做一些“额外”工作,因此现在我想做出最明智的设计决策:
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),但不需要继承链,至少留下一条评论。