您的位置:首页 > 编程语言 > Java开发

策略模式与Spring结合使用

2017-12-01 10:37 417 查看
IOC是Spring的核心之一,利用Spring使用设计模式中的策略模式,可以把具体策略的创建交给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使用就是这么简单,具体细节再结合项目的使用来修改,完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息