Java 春季激励策略设计模式的最佳途径

Java 春季激励策略设计模式的最佳途径,java,spring,design-patterns,strategy-pattern,post-processor,Java,Spring,Design Patterns,Strategy Pattern,Post Processor,我想在spring boot应用程序中实现策略设计模式。我为construct策略解析器创建BeanPostProcessor: @Component public class HandlerInAnnotationBeanPostProcessor implements BeanPostProcessor { private final UnpHandlersResolver unpHandlersResolver; public HandlerInAnnotationBe

我想在spring boot应用程序中实现
策略设计模式
。我为construct
策略解析器创建
BeanPostProcessor

@Component
public class HandlerInAnnotationBeanPostProcessor implements BeanPostProcessor {

    private final UnpHandlersResolver unpHandlersResolver;

    public HandlerInAnnotationBeanPostProcessor(UnpHandlersResolver unpHandlersResolver) {
        this.unpHandlersResolver = unpHandlersResolver;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        Annotation[] annotations = bean.getClass().getAnnotations();
        for (Annotation annotation : annotations) {
            if (annotation instanceof HandlerIn) {

                if (bean.getClass() != UnpHandler.class)
                    throw new RuntimeException("Not UnpHandler bean annotated by HandlerIn");

                SmevMessageType[] type = ((HandlerIn) annotation).type();
                for (SmevMessageType smevMessageType : type) {
                    unpHandlersResolver.setHandler(smevMessageType, (UnpHandler) bean);
                }
            }
        }
        return bean;
    }
}
我创建了解析器:

@Slf4j
@Component
public class UnpHandlersResolverImpl implements UnpHandlersResolver {

    private Map<SmevMessageType, UnpHandler> map = new HashMap<>();

    @Override
    public void setHandler(SmevMessageType messageType, UnpHandler unpHandler) {
        map.put(messageType, unpHandler);
    }

    @Override
    public UnpHandler getUnpHandler(SmevMessageType type) {
        UnpHandler sendRequestHandler = map.get(type);
        if (sendRequestHandler == null)
            throw new IllegalArgumentException("Invalid SendRequestHandler type: " + type);
        return sendRequestHandler;
    }
}
但我不明白如何将findbeans添加到解析器中。在此实现之前,我在
@Postconstruct
解析程序的
方法中找到了bean,比如:

context.getBeansWithAnnotation(HandlerIn.class);
但是在这个解决方案中,
resolver
中有
context
,我认为这是不好的

告诉我如何正确实现我想要的?简而言之,我希望有一组实现不同行为的类。以及控制它们的类。给这个类一个参数,这样他就可以选择正确的策略并把它给我。像这样:

Handler handler = handlersResolver.getHandler(messageType);
Result result = handler.somthing(param);

我将试着做一个简单的例子

Interface Greeting {

void sayHello();

String getSupportedLanguage();

}
然后您有X个实现,您可以在“解析器”的构造函数中循环使用它们来构建映射。(不过我在代码中看到过称之为代理或装饰器的代码,即GreetingProxy或GreetingDecorator)

@服务
公共问候解析器{
私有映射语言togreetingmap=newhashmap();
@自动连线
公共问候语解析程序(列表问候语){
用于(问候语:问候语){
languageToGreetingMap.put(greeting.getSupportedLanguage(),greeting);
}
}
public void sayinggreetingforlanguage(字符串语言){
languageToGreetingMap.get(language.sayHello();
}
}
这是一个基本的例子,说明如何在春季实施战略模式。“问候语”的每个接口实现都只知道它自己以及它能支持什么。然后,我们在一个列表中自动连接所有实现,并循环创建映射一次,然后在运行时仅检索和使用映射中的相关条目

注意:这是直接在网页中输入的“免费”,因此请原谅代码中的任何打字错误。

可能重复的
Interface Greeting {

void sayHello();

String getSupportedLanguage();

}
@Service
public GreetingResolver {

  private Map<String, Greeting> languageToGreetingMap = new HashMap<>();

  @Autowired
  public GreetingResolver(List<Greeting> greetings) {
    for (Greeting greeting : greetings) {
      languageToGreetingMap.put(greeting.getSupportedLanguage(), greeting);
    }
  }

  public void sayGreetingForLanguage(String language) {
    languageToGreetingMap.get(language).sayHello();
  }

}