可见性得以保障,并不意味着
是的,所以可以说您正在编写一个Spring MVC应用程序,然后您决定:“我想做一些单独的封装算法,这些算法可以互换来执行特定的行为”。
对此的经典回应是“您需要一个战略模式男孩!”。 所以,这就是我所做的,考虑下面的代码…
接口
public interface MealStrategy {cook(Meat meat);
}
首要策略
@Component
public class BurgerStrategy implements
MealStrategy {@Autowired CookerDao cookeryDao;@Overridepublic void cook(Meat meat) {cookeryDao.getBurger(meat);}
}
下一个策略
@Component
public class SausageStrategy implements
MealStrategy {@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控制器访问的,例如...
@Autowired
private 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博客上获得。
翻译自: https://www.javacodegeeks.com/2013/11/strategy-pattern-aint-meant-for-spring.html
可见性得以保障,并不意味着