失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 可见性得以保障 并不意味着_战略模式并不意味着春天!

可见性得以保障 并不意味着_战略模式并不意味着春天!

时间:2023-09-13 04:24:03

相关推荐

可见性得以保障 并不意味着_战略模式并不意味着春天!

可见性得以保障,并不意味着

是的,所以可以说您正在编写一个Spring MVC应用程序,然后您决定:“我想做一些单独的封装算法,这些算法可以互换来执行特定的行为”。

对此的经典回应是“您需要一个战略模式男孩!”。 所以,这就是我所做的,考虑下面的代码…

接口

public interface MealStrategy {cook(Meat meat);}

首要策略

@Componentpublic class BurgerStrategy implementsMealStrategy {@Autowired CookerDao cookeryDao;@Overridepublic void cook(Meat meat) {cookeryDao.getBurger(meat);}}

下一个策略

@Componentpublic class SausageStrategy implementsMealStrategy {@Autowired CookerDao cookeryDao;@Overridepublic cook(Meat meat) {return cookeryDao.getSausage(meat);}}

上下文...

@Component@Scope("prototype")public class MealContext {private MealStrategy mealStrategy;public void setMealStrategy(MealStrategy strategy) {this.strategy = strategy;}public void cookMeal(Meat meat) {mealStrategy.cook;}}

现在说这个上下文是通过mvc控制器访问的,例如...

@Autowiredprivate MealContext mealContext;@RequestMapping(method = RequestMethod.POST)public @ResponseBody Something makeMeal(Meat meat) {mealContext.setMealStrategy(new BurgerStrategy());mealContext.cookMeal(meat);}

通常,这对于与策略模式一起使用非常有意义。 但是,使一切崩溃的那一行是控制器中的那一行…

mealContext.setMealStrategy(new BurgerStrategy())

这将导致在Spring的应用程序上下文之外创建bean的新实例。 这很好奇,如果您不能使用new来创建新实例,那么应该如何在Spring中实现模式呢? 在StackOverflow上问了这个问题之后,我得出的结论是使用依赖注入模式(根据Spring中的标准自动装配)并进行策略的单独注入。 首先,我需要修改策略,以便它们命名组件。

@Component("burger")public class BurgerStrategy implements MealStrategy { ... }@Component("sausage")public class SausageStrategy implements SausageStrategy { ... }

现在在控制器中,我有单独的策略可以使用,因此,除了设置策略外,我还只是选择合适的注入策略。

@Resource(name = "burger")MealStrategy burger;@Resource(name = "sausage")MealStrategy sausage;@RequestMapping(method = RequestMethod.POST)public @ResponseBody Something makeMeal(Meat meat) {burger.cookMeal(meat);}

参考:策略模式不适用于Spring! 从我们的JCG合作伙伴 David Gray在Code Mumble博客上获得。

翻译自: //11/strategy-pattern-aint-meant-for-spring.html

可见性得以保障,并不意味着

如果觉得《可见性得以保障 并不意味着_战略模式并不意味着春天!》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。