什么是策略模式?
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
就如你去泡妞:不同的小姐姐性格不同喜欢做的事情不同 【如:小菲温柔,喜欢撸猫 、小美活泼,喜欢打球;你约不同的妹子去玩,就会有不同的体验】
策略模式案例
举个实际的例子,如:小菲温柔,喜欢撸猫 、小美活泼,喜欢打球;你约不同的妹子去玩,就会有不同的体验,这时候策略模式就派上用场了
策略接口:
**
* 玩耍接口
* @author: zyy
*/
public interface play{
/**
* 玩
* @param People
* @return
*/
PlayResult play(People people);
}
人物类:
/**
* 人物信息
* @author: zzy
*/
@Data
public class People {
/**
* 人物性格
*/
private String character;
/**
* 人物名称
*/
private String name;
}
结果集类:
/**
* @author: zzy
*/
@Data
@AllArgsConstructor
public class PlayResult {
/**
* 玩耍活动
*/
private String result;
}
和小菲实现:
/**
* 和小菲
* @author: zzy
*/
@Service("XiaoFei ")
public class XiaoFei implements Play{
@Override
public PlayResult play(People people ) {
return new PayResult("撸猫活动");
}
}
和小美实现:
/**
* 小美
* @author: zzy
*/
@Service("XiaoMei")
public class XiaoMei implements Play{
@Override
public PayResult play(People people ) {
return new PayResult("打球");
}
}
这里我把所有和谁玩的类都用 @Service 注解生成 Bean 放入 Spring Bean 容器中了,在使用策略的时候就不用 new 支付对象了,可以直接使用 Bean,这样更贴近业务。
编写玩耍服务代码:
/**
* 玩耍服务
* @author: zzy
*/
@RestController
public class PlayService {
@Autowired
private ApplicationContext applicationContext;
/**
* 玩耍接口
* @param character
* @param name
* @return
*/
@RequestMapping("/play")
public PayResult play(@RequestParam("character") String character,
@RequestParam("name") String name) {
People people = new People ();
people .setCharacter(character);
people .setName(name);
// 根据人物名称获取对应的策略 bean
Play play= applicationContext.getBean(people .getName(), Play.class);
// 玩耍活动
PayResult payResult = payment.pay(people);
return payResult;
}
}
测试结果:
http://localhost:8080/pay?character=温柔&name=XiaoFei
{"result":"撸猫活动"}
http://localhost:8080/pay?character=活泼&name=XiaoMei
{"result":"打球"}
策略模式总结
模式优点:
1、干掉繁琐的 if、switch 判断逻辑;
2、代码优雅、可复用、可读性好;
3、符合开闭原则,扩展性好、便于维护;
模式缺点
1)客户端必须知道所有策略类,并自行决定使用那个策略类。
2)策略模式将造成产生很多策略类和对象。