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

时间:2015-03-18 18:16:14

标签: java oop inheritance design-patterns abstract-class

我正在重构一段包含大量if / else分支的代码 我正在使用策略模式建议here并创建了一堆实现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);
    }
}

很少有类实际上会覆盖preProcess具有特定逻辑,而其余类只是一个“空”钩子。

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 个答案:

答案 0 :(得分:0)

我认为你可以拥有这样的东西 -

1)Processor界面

2)AbstractProcessor抽象类,它实现Processor并具有preProcess抽象方法。

3)让非特殊情况处理器实现Processor,特殊情况处理器扩展AbstractProcessor类。

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