策略模式与Spring结合使用
2017-12-01 10:37
417 查看
IOC是Spring的核心之一,利用Spring使用设计模式中的策略模式,可以把具体策略的创建交给Spring容器来管理。
首先定义统计接口。
具体的统计算法:
利用
定义策略接口的上下文。
自定义的枚举类型
策略模式的相关定义已经写好,接下来使用就很简单了,按照MVC的架构,我们是在Service层来调用相关的策略算法,首先定义Service接口。
接口实现。
策略模式结合Spring使用就是这么简单,具体细节再结合项目的使用来修改,完毕。
策略模式接口的定义
需求:设计一个统计报表接口,暂定有两种统计方式:统计订单总数,统计新增用户数。首先定义统计接口。
/** * 策略模式的使用:选择统计算法,分离实现 * 统计策略接口:定义统一的调用方法 */ public interface StatStrategy { void getStatData(); }
具体的统计算法:
@Component public class OrderStrategyImpl implements StatStrategy { @Override public void getStatData() { System.out.println("统计订单总数"); } } @Component public class UserStrategyImpl implements StatStrategy { @Override public void getStatData() { System.out.println("统计新增用户数"); } }
利用
@Component注解将算法的实现交由Spring容器管理。
定义策略接口的上下文。
/** * 统计策略的上下文 */ public class StatContext { //装载策略对象的集合,其中key:Statistics类型为自定义的枚举类型 private Map<Statistics, StatStrategy> statStrategy = new HashMap<>(); //提供给客户端使用的方法 public void loadDetailData(Integer strategyId) { for (Map.Entry<Statistics,StatStrategy> entry : statStrategy.entrySet()) { if (entry.getKey().getId()==strategyId.intValue()) { statStrategy.get(entry.getKey()).getStatData(); } } } public Map<Statistics, StatStrategy> getStatStrategy() { return statStrategy; } public void setStatStrategy(Map<Statistics, StatStrategy> statStrategy) { this.statStrategy = statStrategy; } }
自定义的枚举类型
Statistics:
public enum Statistics { 订单_总数统计(101, "【订单】总数统计"), 用户_新增用户数统计(201, "【用户】新增用户数统计"); private int id; private String name; public int getId() { return id; } public String getName() { return name; } Statistics(int id, String name) { this.id = id; this.name = name; } }
策略模式结合Spring来使用
接下来,就是把交由Spring管理的具体算法注入到StatContext 中,用xml文件的形式来实现,Bean的定义写在applicationContext.xml中:
<bean id="statContext" class="StatContext"> <property name="statStrategy"> <map> <entry key-ref="statOrder" value-ref="orderStrategyImpl "></entry> <entry key-ref="statUser" value-ref="userStrategyImpl "></entry> </map> </property> </bean> <!--枚举类型要想注入到类中,一定要先使用org.springframework.beans.factory.config.FieldRetrievingFactoryBean类将枚举类型进行转换--> <bean id="statOrder" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <property name="staticField" value="Statistics.订单_总数统计" /> </bean> <bean id="statUser" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <property name="staticField" value="Statistics.用户_新增用户数统计" /&g 4000 t; </bean>
策略模式的相关定义已经写好,接下来使用就很简单了,按照MVC的架构,我们是在Service层来调用相关的策略算法,首先定义Service接口。
public interface StatService { void loadDetailData(Integer strategyId); }
接口实现。
@Service public class StatServiceImpl implements StatService { @Autowired private StatContext statContext; @Override public void loadDetailData(Integer strategyId) { //策略模式结合Spring使用,使代码结构更清晰,避免多重if-else判断 statContext.loadDetailData(strategyId); } }
策略模式结合Spring使用就是这么简单,具体细节再结合项目的使用来修改,完毕。
相关文章推荐
- 5.3 Spring使用策略模式对访问资源的封装
- 设计模式--spring源码中使用策略模式(Strategy Pattern)
- android 单例模式和策略模式的结合使用
- 简单工厂模式和策略模式结合使用php
- Spring中使用到的设计模式 - 策略模式
- 设计模式实现(二)---策略模式、策略模式与简单工厂模式结合使用
- Spring中Template模式与callback的结合使用浅析
- 与spring结合的策略模式
- 设计模式--spring源码中使用策略模式(Strategy Pattern)
- 关于hibernate与spring的结合使用中的配置文件
- Spring数据访问策略_使用JdbcTemplate
- struts,hibernate , spring结合使用
- Log4j结合spring的使用配置
- web 环境,非web 环境中,freemarker 结合 spring使用。
- 持久化模式,第 1 部分: 现代 ORM 工具的策略和最佳实践,使用 Hibernate 特性在领域模型上应用面向对象原则
- blazeds与spring的结合使用
- 结合session使用lucene单例模式
- php单件模式结合命令链模式使用说明
- ActiveMQspring结合使用
- Head First Design patterns笔记-Strategy Patterns (从不同的人使用不同的交通工具上班看策略模式)