策略是否总是需要从策略模式中的客户端代码传递?

问题描述

我有以下代码

public interface SearchAlgo { public Items search(); }

public class FirstSearchAlgo implements SearchAlgo { public Items search() {...} }

public class SecondSearchAlgo implements SearchAlgo { public Items search() {...} }

我还有一个工厂可以根据客户的输入创建上述具体类的实例。以下 SearchAlgoFactory 代码仅用于上下文。

public class SearchAlgoFactory {
   ...

   public SearchAlgo getSearchInstance(String arg) {
      if (arg == "First") return new FirstSearchAlgo();
      if (arg == "Second") return new SecondSearchAlgo();
   }

}

现在,我有一个类从客户端获取输入,从工厂获取算法并执行它。

public class Manager{
 
   public Items execute(String arg) {
      
        SearchAlgo algo = SearchAlgoFactory.getSearchInstance(arg);
        return algo.search();
   }

}

问题:

我觉得我同时使用了工厂模式和策略模式,但我不确定,因为我看到的任何例子都有一个 Context 类来执行策略,客户端提供了他们想要使用的策略.那么,这是战略的正确实施吗?

解决方法

如果要实现设计模式,理解它们的作用比遵循一些黄金标准参考实现要重要得多。看起来您了解策略模式。

关于策略的重要一点是,实现是一些客户端代码(通常称为上下文)的外部,并且可以在运行时更改。这可以通过让用户直接提供策略对象来实现。然而,通过你的工厂引入另一个级别的间接也是可行的。您的 Manager 类充当您在大多数 UML 图中看到的上下文。

所以,是的。在我看来,您的代码实现了策略模式。