白话-23种设计模式18-策略模式

举报
object 发表于 2022/07/11 21:28:15 2022/07/11
【摘要】 一、白话  点外卖的时候,我们经常会有各种各样的活动,如红包、满减、打折等,但是基本不能同时享受,不能享受一种。于是将各种折扣算法封装起来,选择最优惠的算法就是策略模式二、定义  一个类的行为或其算法可以在运行时更改。  抽象策略角色:约束一系列具体的策略接口。  具体策略角色:实现具体的算法。  上下文角色:负责和具体的策略类交互。三、示例// 抽象策略类-定义策略接口public int...

一、白话

  点外卖的时候,我们经常会有各种各样的活动,如红包、满减、打折等,但是基本不能同时享受,不能享受一种。于是将各种折扣算法封装起来,选择最优惠的算法就是策略模式

二、定义

  一个类的行为或其算法可以在运行时更改

  抽象策略角色:约束一系列具体的策略接口。

  具体策略角色:实现具体的算法。

  上下文角色:负责和具体的策略类交互。

三、示例

// 抽象策略类-定义策略接口
public interface Strategy {
    // 优惠算法
    public double offers(double money);
}
// 具体策略角色-具体实现(折扣)
public class DiscountsStrategy implements Strategy {
    @Override
    public double offers(double money) {
        return money * 0.75;
    }
// 具体策略角色-具体实现(满减)
public class FullReductionStrategy implements Strategy {
    @Override
    public double offers(double money) {
        if (money > 100) {
            return money - 20;
        }
        return money;
    }
}
// 具体策略角色-具体实现(红包)
public class RedEnvelopeStrategy implements Strategy {
    @Override
    public double offers(double money) {
        return money - 5;
    }
}
// 上下文角色-持有策略,动态切换
public class Context {
    private Strategy strategy;

    public double calculate(double money) {
        return strategy.offers(money);
    }

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
}
public class StrategyApplication {
    // 客户端调用
    public static void main(String[] args) {
        // 本次消费100
        double money = 88.0;
        // 新建一个上下文
        Context context = new Context();
        // 满减
        context.setStrategy(new FullReductionStrategy());
        double full = context.calculate(money);
        System.out.println("满减后:" + full);
        // 折扣
        context.setStrategy(new DiscountsStrategy());
        double discount = context.calculate(money);
        System.out.println("折扣后:" + discount);
        // 红包
        context.setStrategy(new RedEnvelopeStrategy());
        double redEnv = context.calculate(money);
        System.out.println("使用红包后:" + redEnv);

        // 求出本次最优惠方案,也可以根据用户身份,每个人享有不同的权利
        double min = Double.min(Double.min(full, discount), redEnv);
        System.out.println("本次最优惠金额为:" + min + "元");
    }
}

输出示例:

满减后:88.0
折扣后:66.0
使用红包后:83.0
本次最优惠金额为:66.0元

四、总结

  特点:1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。4、不当使用会导致策略类过多。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。