繁体   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