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