模板模式,但与其中一个类不实现方法

问题描述 投票:0回答:3

我想实现模板方法模式,但我需要一个微小的变化,我不认为这是最好的做法。我的班以下结构

abstract class AbsClass {
    public void algorithm(){
        step1();
        step2();
    }
    private void step1() {
        //implementation
    }

    protected abstract void step2();
}

class A extends AbsClass {
    protected void step2() {
        // With implementation
    }
}

class B extends AbsClass {
    protected void step2() {
        // No implementation needed
    }
}

在现实情况下,我喜欢有4类,其中一人并不需要有执行第二步。我不认为离开法空将是很好的做法。我的想法是把评论(说有没有必要实现)在里面,但是我没有,这将是正确的解决方案。是否有另一种方法我没有看到?

java oop design-patterns
3个回答
2
投票

我同意@Vinay Avasthi的答案,但我想加固。

Hook Method

挂钩方法在基类中定义,是一个默认的实现。这些可以被覆盖 - 他们不必。

Template-Method-Pattern Wikipedia页:

模板方法的抽象类也可以定义可以由子类所覆盖钩方法。这些都在抽象类无操作实现,但提供在其上“挂”实现一个“钩”。

Improvement

你应该做的是留在方法的身体像// empty method body评论让别人读你的代码(也许你自己)都知道,这种方法并没有被遗忘

Java的默认方法

还有就是在Java中实现模板的方法,模式的第二种方式。由于Java 8,可以有默认的方法实现一个接口。

如果你的方法不依赖于状态时,它可能看起来像:

interface AbsClass {

  default void algorithm(){
    step1();
    step2();
  }

  default void step1() {
    // implementation or empty
  }

  default void step2() {
    // empty body in default case
  }
}

class B implements AbsClass { }

2
投票

我认为这是绝对的罚款。如果第二步的默认行为是什么都不做,那么你可以在基类中的空方法和子类中重写。


2
投票

我们不应该强迫的设计模式。在这里,如果我们喜欢在组成然后继承其更好。

目前在这个问题的代码,我们在一个类中定义的方法,但实际上方法有没有问题。强制在一类的地方不应该belomg到是不是一个好主意的方法。

下面就是这样的一个可能的实现,你不会强迫的方法的一类,如果它不属于它。下面是基于策略行话,但我仍然要说遵循的设计原则,让图案本身适合您的问题,不要强迫模式适合您的解决方案。

public class AlgorithmClass {
    private Strategy strategy;
    public void setStrategy(Strategy strategy){
        this.strategy = strategy;
    }
    public void algorithm(){
        step1();
        step2();
    }
    private void step1() {
        //implementation
    }

    private  void step2(){
        if(this.strategy != null){
              this.strategy.execute();
       }
    }
}

public interface Strategy{
    public void execute();
}

public class Strategy1 implements Strategy{
    public void execute(){
         //implement your one of the stategies for step 2
   }
}

public class Strategy2 implements Strategy{
    public void execute(){
         //implement your another stategy for step 2
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.