策略模式在项目中实际应用
Java策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。在Java中实现策略模式,通常包含三个角色:
策略接口:定义了一个公共接口,所有的具体策略类都必须实现这个接口。
具体策略类:实现了策略接口中定义的方法,每一个具体策略类都封装了一种具体的算法或行为。
上下文类:持有一个策略对象的引用,并负责调用其方法来执行相应的算法或行为。上下文类还可以维护对策略对象的引用,并可在运行时动态地改变所使用的策略对象。
- 上下文本类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class StrategyContext {
// 保证线程安全
private final Map<String, CommonStrategyService> strategyServiceMap = new ConcurrentHashMap<>();
@Autowired
public void strategyInterface(Map<String, CommonStrategyService> strategyServiceMap) {
this.strategyServiceMap.clear();
strategyServiceMap.forEach(this.strategyServiceMap::put);
}
public CommonStrategyService getStrategy(String str) {
if (str.equals("A")) {
return this.strategyServiceMap.get(str);
} else if (str.equals("B")) {
return this.strategyServiceMap.get(str);
} else {
return this.strategyServiceMap.get("COMMON");
}
}
}
- 策略接口
public interface CommonStrategyService {
void getTest();
boolean success();
}
- 具体策略类
@Service(value = "A")
public class AStrategyServiceImpl implements CommonStrategyService{
@Override
public void getTest() {
}
@Override
public boolean success() {
return false;
}
}
@Service(value = "B")
public class BStrategyServiceImpl implements CommonStrategyService{
@Override
public void getTest() {
}
@Override
public boolean success() {
return false;
}
}
@Service(value = "COMMON")
public class CommonStrategyServiceImpl implements CommonStrategyService{
@Override
public void getTest() {
}
@Override
public boolean success() {
return false;
}
}
- 测试
@Service
public class StrategyTest {
@Autowired
private StrategyContext strategyContext;
public void test() {
strategyContext.getStrategy("A").getTest();
strategyContext.getStrategy("B").success();
}
}