Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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_Design Patterns_Refactoring_Code Reuse - Fatal编程技术网

如何更改java代码,使其子类能够以最小的影响对其进行定制

如何更改java代码,使其子类能够以最小的影响对其进行定制,java,design-patterns,refactoring,code-reuse,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 li

我的代码有以下情况

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{}

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

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

abstract void doAdditionalStuff(/*needed parameters from class 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
}

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

abstract void doAdditionalStuff(/*needed parameters from class 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
}

将业务逻辑的概念理解为

  • 提供的服务
  • 要求(生产某物)分别要提供(实施)的回调(响应)
因此:

注意:

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

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

将业务逻辑的概念定义为

  • 提供的服务
  • 要求(生产某物)分别要提供(实施)的回调(响应)
因此:

注意:

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

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

谢谢您的回答。我这里有一个问题-在您提到的设计中,我们如何将junits编写为抽象的超类?@VRK只需在测试源中创建一个子类或使用模拟框架。例如,使用mockito,您可以创建抽象类的mock,并告诉mockito调用real方法。但我认为这是你应该问的另一个问题。谢谢@rene-Link!谢谢你的回答。我这里有一个问题-在您提到的设计中,我们如何将junits编写为抽象的超类?@VRK只需在测试源中创建一个子类或使用模拟框架。例如,使用mockito,您可以创建抽象类的mock,并告诉mockito调用real方法。但我认为这是你应该问的另一个问题。谢谢@rene-Link!