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