gpt4 book ai didi

java - 在 Spring 中实现策略设计模式的最佳方式

转载 作者:行者123 更新时间:2023-12-04 13:43:40 24 4
gpt4 key购买 nike

我要工具strategy design pattern在 Spring Boot 应用程序中。我创建 BeanPostProcessor用于构造 strategy resolver :

@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;
}
}

我的 BeanPostProcessor扫描所有带有注释的 bean HandlerIn并添加到解析器的 mup 中。我认为这样做是错误的:
unpHandlersResolver.setHandler(smevMessageType, (UnpHandler) bean);

但我不明白如何将 find bean 添加到解析器。在此实现之前,我发现 bean 位于 @Postconstruct resolver的方法喜欢:
context.getBeansWithAnnotation(HandlerIn.class);

但在这个解决方案中,我有 contextresolver我认为是坏的。

告诉我如何正确实现我想要的?简而言之,我想要一组实现不同行为的类。以及控制它们的类。给类(class)一个参数,以便他选择正确的策略并将其提供给我。像这样:
Handler handler = handlersResolver.getHandler(messageType);
Result result = handler.somthing(param);

最佳答案

我将尝试做一个简单的例子。

Interface Greeting {

void sayHello();

String getSupportedLanguage();

}

然后你有 X 个实现,你可以在“解析器”的构造函数中循环它们来构建 map 。 (不过,我已经在代码中看到这称为代理或装饰器,即 GreetingProxy 或 GreetingDecorator)
@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();
}

}

这是一个如何在 Spring 中执行策略模式的基本示例。 “Greeting”的每个接口(interface)实现只知道它自己以及它可以支持什么。然后我们 Autowiring 列表中的所有实现并循环创建 map 一次 然后在运行时只检索和使用 map 中的相关条目。

注意:这是直接在网页中“徒手”输入的,所以请原谅代码中的任何错别字。

关于java - 在 Spring 中实现策略设计模式的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52756837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com