策略模式
就是一个类的方法可以在运行时修改。降维到代码层面,就是运行的时候我给你这个类的方法传不同的 “key”,你这个方法就会执行不同的业务逻辑,这不就是if/else做的事。也就是运行时改变业务逻辑行为。
//抽象策略接口
public interface AbstractStrategy {
void executeDiscount();
}
//策略实现类
public class CommonManStrategy implements AbstractStrategy {
@Override
public void executeDiscount() {
System.out.println("执行普通用户的优惠!!");
}
}
public class MemberStrategy implements AbstractStrategy {
@Override
public void executeDiscount() {
System.out.println("执行会员的优惠!!!");
}
}
//逻辑分派类
/**
* 逻辑分发器
*/
public class StrategyDistriutor {
//组合策略
private AbstractStrategy abstractStrategy;
public StrategyDistriutor(AbstractStrategy abstractStrategy) {
this.abstractStrategy = abstractStrategy;
}
//执行策略
public void executeDiscount(){
abstractStrategy.executeDiscount();
}
/**
* 策略设计模式,运行时改变业务逻辑行为。
*/
public class StrategyPattern {
public static void main(String[] args) {
StrategyDistriutor strategyDistriutor = new StrategyDistriutor(new CommonManStrategy());
strategyDistriutor.executeDiscount();
StrategyDistriutor memberStrategy = new StrategyDistriutor(new MemberStrategy());
memberStrategy.executeDiscount();
}
}
策略模式的优点是将策略抽象出来,使结构更加的清晰,好维护。缺点是当策略多时,需要创建数量庞大的策略类。并且,不能全局的俯视业务逻辑。
当然,有缺点自然就会有人优化。这不阿里的大神就分享出来一条解决的思路。话不多说,直接上代码。
先上思路导图:
/**
* 业务集合类
*/
@Component
public class BusinessGather {
public Object rookieGiftRelease(){
System.out.println("新手礼包发布");
return "发布成功!";
}
public Object holidayInfoRelease(){
System.out.println("节日信息发布");
return "发布成功!";
}
}
/**
* Map组合函数式接口解决策略模式类多,遍历全局业务逻辑困难的场景。
*/
@Component
public class FunctionMapMode {
@Autowired
private BusinessGather businessGather;
public FunctionMapMode(BusinessGather businessGather) {
initStrategyMap();
this.businessGather = businessGather;
}
private static Map<Object, Function<Object,Object>> businessMap = new HashMap<>();
public void initStrategyMap(){
businessMap.put("rookieGiftRelease",s -> businessGather.rookieGiftRelease());
businessMap.put("holidayInfoRelease",s -> businessGather.holidayInfoRelease());
}
public void release(Object o){
Function<Object,Object> function = businessMap.get(o);
function.apply(o);
}
}
public class NewModePattern {
public static void main(String[] args) {
//这里直接new,因为没启动spring容器
FunctionMapMode functionMapMode = new FunctionMapMode(new BusinessGather());
functionMapMode.release("rookieGiftRelease");
functionMapMode.release("holidayInfoRelease");
}
}
是不是超级简单且非常有用,在日常的开发业务中也能很好的运用上去。
还在等什么呢,老铁,点赞加收藏呀!!
装逼技术哪家强,博客之中我最强,嘻嘻,喜欢就关注我吧。