看了一篇设计模式文章后,做个笔记表示曾经努力过。
先放个平时冗余的写法:
public String getBonusPlan(Integer bonus) {
if (bonus.equals(100)) {
return "吃呷哺火锅";
} else if (bonus.equals(300)) {
return "吃蜀大侠火锅";
} else if (bonus.equals(500)) {
return "吃海底捞火锅";
}
// 一大波火锅来袭。。。。
}
一、创建奖金接口
// 奖金接口
public interface IBonusService {
// 奖金使用方法
public String bonusUsePlan(Integer bonus);
}
二、创建奖金工厂类(工厂模式)
/**
* 奖金工厂类
*/
public class BonusStrategyFactory {
// 用map来保存如何使用奖金的策略类
private static Map<Integer,IBonusService> strategyMap = new ConcurrentHashMap<Integer,IBonusService>();
// 通过奖金多少查找对应的使用策略
public static IBonusService getByBonus(Integer bonus){
return strategyMap.get(bonus);
}
// 将奖金和对应的使用策略注册到map里
public static void register(Integer bonus ,IBonusService bonusService){
Assert.notNull(bonus,"bonus can't be null");
strategyMap.put(bonus,bonusService);
}
}
三、编写接口实现(策略模式)
1.策略一:呷哺火锅
/**
* 呷哺火锅方案
*/
@Service
public class XiabuBonusServiceImpl implements IBonusService, InitializingBean {
@Override
public String bonusUsePlan(Integer bonus) {
return "去呷哺吃"+bonus+"元的火锅";
}
@Override
public void afterPropertiesSet() throws Exception {
// 将策略注册到Map中
BonusStrategyFactory.register(100,this);
}
}
2.策略二: 蜀大侠火锅
/**
* 蜀大侠火锅
*/
@Service
public class ShudaxiaBonusServiceImpl implements IBonusService, InitializingBean {
@Override
public String bonusUsePlan(Integer bonus) {
return "去蜀大侠吃"+bonus+"元的火锅";
}
@Override
public void afterPropertiesSet() throws Exception {
// 将策略注册到Map中
BonusStrategyFactory.register(300,this);
}
}
3.策略三: 海底捞火锅
/**
* 海底捞火锅
*/
@Service
public class HaidilaoBonusServiceImpl implements IBonusService, InitializingBean {
@Override
public String bonusUsePlan(Integer bonus) {
return "去海底捞吃"+bonus+"元的火锅";
}
@Override
public void afterPropertiesSet() throws Exception {
// 将策略注册到Map中
BonusStrategyFactory.register(500,this);
}
}
四、奖金使用方案Service类
@Service
@Transactional
public class BonusService {
@Autowired
XiabuBonusServiceImpl xiabuBonusService;
@Autowired
ShudaxiaBonusServiceImpl shudaxiaBonusService;
@Autowired
HaidilaoBonusServiceImpl haidilaoBonusService;
public String getBonusPlan(Integer bonus) {
// 在工厂里通过奖金拿到对应的使用策略
IBonusService service = BonusStrategyFactory.getByBonus(bonus);
// 调用策略类的相应方法
return service==null?null:service.bonusUsePlan(bonus);
}
}
五、测试
@SpringBootTest
class ApplicationTests {
@Autowired
BonusService bonusService ;
@Test
public void test(){
int bonus = 300
String bonusPlan = bonusService.getBonusPlan(bonus);
if(bonusPlan==null){
System.out.println("未查到相应策略");
}else{
System.out.println(bonusPlan);
}
}
}