[英]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.