3 回答
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
}
}
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 { }
添加回答
舉報
