重写抽象方法时的常用代码 - 设计问题

Sim*_*mbi 3 java design-patterns abstract

我有一个像这样的抽象类

public abstract Stuff
{
    public abstract void doStuff();
}
Run Code Online (Sandbox Code Playgroud)

几个类正在扩展Stuff,重写doStuff().doStuff()通常为每个实现执行完全不同的任务,但共享一个共同的部分.

什么是实现这个的最佳方式?

我不想写一些像:

public void doStuff()
{
    doTheCommonPart();
    ...
}
Run Code Online (Sandbox Code Playgroud)

在每个扩展类中.

Joã*_*lva 6

您可以使用模板方法模式:

public abstract Stuff
{
    public abstract void doStuff();

    public void doTheCommonPart() {
      // ...
    }

    // Template method
    public final void doIt() {
      doTheCommonPart();
      doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您的客户端类只需调用模板方法doIt().它将执行公共代码部分,以及抽象方法的具体实现doStuff().


Dun*_*nes 5

任何一个:

  1. 将公共代码放在类中的一个protected方法中,Stuff并从 的每个实现中调用它doStuff;或者

  2. 将公共代码添加到您的抽象Stuff类并调用另一个抽象方法。

例如(1)

public abstract Stuff  
{
    public abstract void doStuff();

    protected void commonCode() 
    {
      //...
    }
}
Run Code Online (Sandbox Code Playgroud)

或 (2)

public abstract Stuff
{
    public void doStuff() 
    {
      // Do the common stuff initially...
      // ...

      // Then call the subclass implementation
      doRealStuff();
    }

    public abstract void doRealStuff();
}
Run Code Online (Sandbox Code Playgroud)