亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模板模式,但其中一個類未實現該方法

模板模式,但其中一個類未實現該方法

慕桂英3389331 2022-06-08 16:57:16
我正在嘗試實現模板方法模式,但我需要一些我認為不是最佳實踐的細微變化。我有以下類結構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 個類,其中一個不需要在第二步中實現。我不認為將方法留空將是一個好習慣。我想在其中發表評論(說不需要實施),但我不認為這是正確的解決方案。還有另一種我沒有看到的方法嗎?
查看完整描述

3 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

我們不應該強制設計模式。在這里,如果我們更喜歡組合而不是繼承,那么它會更好。


問題中的代碼我們在類中定義了一個方法,但實際上方法沒有行為。在不應該屬于的類中強制使用方法不是一個好主意。


下面是一種這樣的可能實現,如果方法不屬于某個類,您將不會強制它使用它。以下是基于策略模式的,但我仍然會說遵循設計原則,讓模式本身適合您的問題,不要強迫模式適合您的解決方案。


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

   }

}


查看完整回答
反對 回復 2022-06-08
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

鉤法

掛鉤方法在基類中定義,是默認實現。這些可以被覆蓋 - 他們不必這樣做。

模板-方法-模式維基百科頁面:

模板方法的抽象類也可以定義可能被子類覆蓋的鉤子方法。它們在抽象類中有一個無操作實現,但提供了一個“掛鉤”,用于“掛起”實現。

改進

您應該做的是在方法主體中留下注釋,// empty method body以便閱讀您的代碼的人(也許是您自己)知道該方法沒有被遺忘

Java 的默認方法

還有第二種方法可以在 Java 中實現 Template-Method-Pattern。從 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 { }


查看完整回答
反對 回復 2022-06-08
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

我認為這絕對沒問題。如果 step2 的默認行為是什么都不做,那么您可以在基類中有一個空方法并在子類中覆蓋。



查看完整回答
反對 回復 2022-06-08
  • 3 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號