簡體   English   中英

應該使用什么模式,策略?

[英]What pattern should be used, strategy?

我確實有一項服務需要處理兩種類型的餐點。

@Service
class MealService {

   private final List<MealStrategy> strategies;

   MealService(…) {
       this.strategies = strategies;
   }

   void handle() {
       var foo = …;
       var bar = …;
       strategies.forEach(s -> s.remove(foo, bar));
   }
}

有兩種策略,“BurgerStrategy”和“PastaStrategy”。 兩者都使用一個名為 remove 的方法實現 Strategy 接口,該方法采用兩個參數。

BurgerStrategy class 從數據庫中檢索枚舉類型的漢堡餐,並對其進行迭代並執行一些操作。 PastaStrategy 也有類似的東西。

問題是,將其稱為 Strategy 並以這種方式實施是否有意義?

此外,如何處理這兩個服務中的代碼重復,假設兩者共享相同的私有方法。 創建一個 Helper class 之類的東西有意義嗎?

將其稱為戰略並以這種方式實施是否有意義

我認為這些類“BurgerStrategy”和“PastaStrategy”具有共同的行為。 當您想注入一種策略並使用它時,將使用策略模式。 但是,您正在遍歷所有行為。 你並沒有通過制定一種策略並堅持下去來設定行為。 因此,以我的名義,我認為最好避免在此處使用Strategy一詞。

所以策略模式看起來像這樣。 對不起,我不是 Java 人。 讓我通過 C# 來展示。但是我已經提供了代碼在 Java 中的樣子的評論。這是我們的策略抽象:

public interface ISoundBehaviour
{
    void Make();
}

及其具體實現:

public class DogSound : ISoundBehaviour // implements in Java
{
    public void Make()
    {
        Console.WriteLine("Woof");
    }
}


public class CatSound : ISoundBehaviour
{
    public void Make()
    {
        Console.WriteLine("Meow");
    }
}

然后我們堅持一種也可以被替換的行為:

public class Dog
{
    ISoundBehaviour _soundBehaviour;

    public Dog(ISoundBehaviour soundBehaviour)
    {
        _soundBehaviour = soundBehaviour;
    }

    public void Bark()
    { 
        _soundBehaviour.Make();
    }

    public void SetAnotherSound(ISoundBehaviour anotherSoundBehaviour) 
    {
        _soundBehaviour = anotherSoundBehaviour;
    }
}   

如何處理這兩個服務中的代碼重復,假設兩者共享相同的私有方法。

您可以創建一個基礎,抽象 class。所以基本思想是將公共邏輯放入一些公共基礎 class。然后我們應該在抽象 class 中創建抽象方法。為什么? 通過這樣做,子類將具有針對具體情況的特定邏輯。 讓我舉個例子。

具有共同行為的抽象 class:

public abstract class BaseMeal
{
    // I am not Java guy, but if I am not mistaken, in Java,
    // if you do not want method to be overriden, you shoud use `final` keyword
    public void CommonBehaviourHere()
    { 
        // put here code that can be shared among subclasses to avoid code duplication
    }

    public abstract void  UnCommonBehaviourShouldBeImplementedBySubclass();
}

及其具體實現:

public class BurgerSubclass : BaseMeal // extends in Java
{
    public override void UnCommonBehaviourShouldBeImplementedBySubclass()
    {
        throw new NotImplementedException();
    }
}

public class PastaSubclass : BaseMeal // extends in Java
{
    public override void UnCommonBehaviourShouldBeImplementedBySubclass()
    {
        throw new NotImplementedException();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM