目录
一、介绍
什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重if判断问题。 1.环境(Context)角色:持有一个Strategy的引用。 2.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 3.具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。 定义策略接口->实现不同的策略类->利用多态或其他方式调用策略 为什么叫做策略模式 每个if判断都可以理解为就是一个策略。 策略模式优缺点 优点 算法可以自由切换(高层屏蔽算法,角色自由切换) 避免使用多重条件判断(如果算法过多就会出现很多种相同的判断,很难维护) 扩展性好(可自由添加取消算法 而不影响整个功能) 缺点 策略类数量增多(每一个策略类复用性很小,如果需要增加算法,就只能新增类) 所有的策略类都需要对外暴露(使用的人必须了解使用策略,这个就需要其它模式来补充,比如工厂模式、代理模式) 策略模式应用场景
二、示例
package com.example.designmode.demo.strategy;
import javax.servlet.http.HttpServletResponse;
public interface DiseaseStrategy {
void downLoadTemplate(HttpServletResponse response, String code);
}
package com.example.designmode.demo.strategy;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class StrategyContext {
private final Map<String, DiseaseStrategy> strategyMap = new ConcurrentHashMap<>();
public StrategyContext(Map<String, DiseaseStrategy> strategyMap) {
this.strategyMap.clear();
strategyMap.forEach((k, v)-> this.strategyMap.put(k, v));
}
public void downLoadTemplate(HttpServletResponse response, String code) {
strategyMap.get(code).downLoadTemplate(response, code);
}
}
package com.example.designmode.demo.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class GNBZ01 implements DiseaseStrategy {
@Override
public void downLoadTemplate(HttpServletResponse response, String code) {
log.info("downLoadTemplate start,病种:{}", code);
}
}
package com.example.designmode.demo.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class GNBZ02 implements DiseaseStrategy {
@Override
public void downLoadTemplate(HttpServletResponse response, String code) {
log.info("downLoadTemplate start,病种:{}", code);
}
}
package com.example.designmode.demo.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
@Component
@Slf4j
public class GNBZ03 implements DiseaseStrategy {
@Override
public void downLoadTemplate(HttpServletResponse response, String code) {
log.info("downLoadTemplate start,病种:{}", code);
}
}