如何更改java代码,以便它的子类定制,影响最小

时间:2018-02-16 10:00:35

标签: java design-patterns refactoring code-reuse

我的代码有以下情况。

class A{

    public void putLogicHere(){

        //method is about 500 lines long.

        //Initial Few lines of code will be common 

        //middle part of code will be customized by its subclasses

        //Again here comes few lines of common code

    }
}

class B extends A{}
class C extends A{}

在设计层面,我应该采取什么方法来进一步打破这段代码?考虑到方法的中间部分将由层次结构中的其他人自定义。

2 个答案:

答案 0 :(得分:5)

我会将A类作为abstract类,并在其中创建一个抽象方法,如:

abstract void doAdditionalStuff(/*needed parameters from class A*/);

并在A中使用它:

public void putLogicHere(){
    //Initial Few lines of code will be common 
    //Here use the abstract method implemented in subclasses
    doAdditionalStuff();

    //Again here comes few lines of common code

}

然后,B类和C类可以实现该方法:

@Override
doAdditionalStuff() {
  //middle part of code will be customized by its subclasses
}

答案 1 :(得分:0)

将业务逻辑的概念视为

  • 提供服务(s)
  • 要求(生产某些东西) 回调(作出反应)提供(实施)

所以:

(abstract) class Base {
    public final void oneService() {
        ...
        U u = requirementX(X x);
        ...
        V v = requirementY(Y y);
        ...
    }
    protected U requirementX(X x) {
    }
    abstract protected V requirementY(Y y);
}

class Aaa extends Base { ... }
class Bbb extends Base { ... }

注意:

  • 服务可能是最终的
  • 要求可以受到保护,应该被覆盖,并且可以有基类准备的额外上下文参数。

使用Java 8代替受保护方法的继承,设置一些函数指针/ lambda参数有时可能会更好。