欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java策略模式与Spring整合

程序员文章站 2022-06-17 17:14:26
...

java设计模式有很多种,其中策略模式算是比较常用的。在项目写完之后对部分代码进行了重构,其中就用到了策略模式(strategy),有了一点体会就记录一点点

需求:根据不同的渠道代码自动生成流水号,

需求很简单,我们常用的if else if …..else就能够把需求解决,但这样程序拓展性能不好,每添加一条就要修改不少的if else的源代码,所以这里就使用了策略模式。
第一步:先看策略接口

/**
 * 运用策略模式来自动生成袋号
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2017</p> 
 * @author ll
 * @version V1.0
 */
public interface BoardNoService {
    /**
     * 根据不用的渠道代码生成不同的袋号,如果渠道代码为空,则按照coe指定的默认生成规则生成袋号
     * 暂时只支持"ETRR"和"ETRN"两种渠道
     * @param channelCode:渠道代码
     * @return
     */
    public String produceBoardNo(String channelCode);
}

第二步:看策略接口的具体实现:在这里具体实现方法和业务逻辑就不贴上来了,不是重点。
java策略模式与Spring整合
第三步:创建一个策略持有类

public class BoardNoContext {

    private Map<String, BoardNoService> mapStractegy = new HashMap<String, BoardNoService>();

    public Map<String, BoardNoService> getMapStractegy() {
        return mapStractegy;
    }
    public void setMapStractegy(Map<String, BoardNoService> mapStractegy) {
        this.mapStractegy = mapStractegy;
    }
    public String getNewBoardNo(String channelCode){
        return this.mapStractegy.get(channelCode).produceBoardNo(channelCode);
    }
}

这个策略持有类有个成员属性map,map的key就是对应的渠道代码,map对应的value就是策略接口;
这个类中的getNewBoardNo()方法就是map中取出第一步中的策略接口的具体实现类,并调用该类的produceBoardNo()方法生成一个流水号,然后返回。
使用的时候先注入:
java策略模式与Spring整合
再调用其方法:
java策略模式与Spring整合

然后再看看在applicationContext.xml中的配置:

<!-- 使用策略模式根据不同的渠道,按指定规则生成袋号   该bean是策略持有类 -->
    <bean id="bc" class="com.coe.exp.service.board.BoardNoContext">
        <!-- mapStractegy是一个map,key是渠道代码,value是策略接口的实现-->
        <property name="mapStractegy">
            <map>
                <entry key="ETRN" value-ref="etrn"></entry>
                <entry key="ETRR" value-ref="etrr"></entry>
                <entry key="COE" value-ref="coe"></entry>
            </map>
        </property>
    </bean>
    <bean id="etrn" class="com.coe.exp.service.board.impl.ETRNBoardNoServiceImpl"></bean>
    <bean id="etrr" class="com.coe.exp.service.board.impl.ETRRBoardNoServiceImpl"></bean>
    <bean id="coe" class="com.coe.exp.service.board.impl.COEBoardNoServiceImpl"></bean>

直接debug一次,看结果
java策略模式与Spring整合
以上就是策略模式在项目中的实际应用,希望能帮助读者