策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
案例
- 定义一个接口
package com.reference.demo.Strategy;
/**
* @Auther: wxy
* @Date: 2020/9/24 15:39
* 策略模式
*/
public interface Strategy {
String getPlan(String id);
}
- 实现
package com.reference.demo.Strategy;
/**
* @Auther: wxy
* @Date: 2020/9/24 15:41
* @Description:
*/
//@Component("A")
public class AStrategyImpl implements Strategy {
@Override
public String getPlan(String id) {
System.out.println("AStrategyImpl :"+id);
return id;
}
}
package com.reference.demo.Strategy;
/**
* @Auther: wxy
* @Date: 2020/9/24 15:41
* @Description:
*/
//@Component("B")
public class BStrategyImpl implements Strategy {
@Override
public String getPlan(String id) {
System.out.println("BStrategyImpl :"+id);
return id;
}
}
- 定义策略容器
package com.reference.demo.Strategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @Auther: wxy
* @Date: 2020/9/25 15:25
* @Description:
*/
@Component
public class MyStrategyContext {
@Autowired
private Map<String, Strategy> map;
public String getPlan(String id) {
Strategy strategy = map.get(id);
if (strategy == null) {
throw new RuntimeException("no impl this strategy for:" + id);
}
return strategy.getPlan(id);
}
;
}
- yml控制
配置类:
package com.reference.demo.config;
import com.reference.demo.Strategy.AStrategyImpl;
import com.reference.demo.Strategy.BStrategyImpl;
import com.reference.demo.Strategy.Strategy;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Auther: wxy
* @Date: 2020/9/25 14:25
* @Description:
*/
@Configuration
public class MyStrategyConfig {
@Bean
@ConditionalOnProperty(prefix = "my.strategy.config",name = "a",havingValue = "true" )
//@ConditionalOnMissingBean(Strategy.class)
public Strategy A(){
return new AStrategyImpl();
}
@Bean
@ConditionalOnProperty(prefix = "my.strategy.config",name = "b",havingValue = "true" )
//@ConditionalOnMissingBean(Strategy.class)
public Strategy B(){
return new BStrategyImpl();
}
}
yml
server:
port: 8080
my:
strategy:
config:
a: true
b: true
- 控制器
package com.reference.demo.controller;
import com.reference.demo.Strategy.MyStrategyContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auther: wxy
* @Date: 2020/9/24 15:52
* @Description:
*/
@RestController
public class StrategyController {
@Autowired
private MyStrategyContext context;
@RequestMapping("/strategy")
public String test(String id){
return context.getPlan(id);
}
}