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

时间:2012-09-16 15:45:40

标签: java design-patterns abstract

我有一个像这样的抽象类

public abstract Stuff
{
    public abstract void doStuff();
}

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

实现这个的最好方法是什么?

我不想写像:

public void doStuff()
{
    doTheCommonPart();
    ...
}

在每个扩展课程中。

3 个答案:

答案 0 :(得分:6)

您可以使用Template Method Pattern

public abstract Stuff
{
    public abstract void doStuff();

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

    // Template method
    public final void doIt() {
      doTheCommonPart();
      doStuff();
    }
}

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

答案 1 :(得分:4)

或者:

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

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

  3. E.g。 (1)

    public abstract Stuff  
    {
        public abstract void doStuff();
    
        protected void commonCode() 
        {
          //...
        }
    }
    

    或(2)

    public abstract Stuff
    {
        public void doStuff() 
        {
          // Do the common stuff initially...
          // ...
    
          // Then call the subclass implementation
          doRealStuff();
        }
    
        public abstract void doRealStuff();
    }
    

答案 2 :(得分:2)

您可以像这样定义它,类似于template method design pattern

public abstract Stuff
{
    public abstract void doSpecificStuff();

    public void doStuff()
    {
        doCommonStuff();
        doSpecificStuff();
    }
}