增强版的策略模式

策略模式

就是一个类的方法可以在运行时修改。降维到代码层面,就是运行的时候我给你这个类的方法传不同的 “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");
    }
}

是不是超级简单且非常有用,在日常的开发业务中也能很好的运用上去。

还在等什么呢,老铁,点赞加收藏呀!!

装逼技术哪家强,博客之中我最强,嘻嘻,喜欢就关注我吧。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值