如何更改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!