@Override
public void doPromotion(Order order) {
// 满200减20
if (order.getPrice() > 200) {
order.setPrice(order.getPrice() - 20);
System.out.println(“使用了满200减20优惠”);
}
}
}
复制代码
package fun.swsk33site.strategy.promotion.impl;
import fun.swsk33site.strategy.model.Order;
import fun.swsk33site.strategy.promotion.Promotion;
/**
- 返现促销
*/
public class CashBackPromotion implements Promotion {
@Override
public void doPromotion(Order order) {
// 满200返现20
if (order.getPrice() > 200) {
// 返现20…
System.out.println(“使用了满200返现20到支付宝账户优惠”);
}
}
}
复制代码
最后创建客户端类执行支付逻辑:
Order order1 = new Order();
order1.setName(“xxx”);
order1.setPrice(123);
String strategy = “fulldiscount”;
Promotion promotion = null;
if (strategy.equals(“no”)) {
promotion = new NoPromotion();
} else if (strategy.equals(“fulldiscount”)) {
promotion = new FullDiscountPromotion();
} else if (strategy.equals(“cashback”)) {
promotion = new CashBackPromotion();
}
promotion.doPromotion(order1);
复制代码
很显然这样写是完全不实用的,如果说促销活动越来越多,那么客户端的代码将会越来越复杂,越来越臃肿。
2,使用策略模式改造
我们可以单独创建一个类,这个类专门用于来根据传入参数选择不同的策略。
首先我们来创建一个枚举类型PromotionStrategy
,用于作为选择优惠策略的参数:
package fun.swsk33site.strategy.promotion;
/**
- 优惠策略枚举
*/
public enum PromotionStrategy {
/**
- 不使用优惠
*/
NO,
/**
- 满减优惠
*/
FULLDISCOUNT,
/**
- 返现优惠
*/
CASHBACK
}
复制代码
然后创建类PromotionContext
,用于传入参数后选择相应的优惠策略,这个类就是我们策略模式的核心了:
package fun.swsk33site.strategy.promotion;
import fun.swsk33site.strategy.model.Order;
import fun.swsk33site.strategy.promotion.impl.CashBackPromotion;
import fun.swsk33site.strategy.promotion.impl.FullDiscountPromotion;
import fun.swsk33site.strategy.promotion.impl.NoPromotion;
import java.util.HashMap;
import java.util.Map;
/**
- 优惠策略选择上下文,用于选择优惠策略
*/
public class PromotionContext {
// 用一个Map作为容器储存各个优惠策略的类,以枚举为参数取出
private static Map<PromotionStrategy, Promotion> promotionMap = new HashMap<>();
// 静态块用于初始化各个优惠策略实例
static {
promotionMap.put(PromotionStrategy.NO, new NoPromotion());
promotionMap.put(PromotionStrategy.FULLDISCOUNT, new FullDiscountPromotion());
promotionMap.put(PromotionStrategy.CASHBACK, new CashBackPromotion());
}
/**
-
使用优惠
-
@param order 传入要使用优惠的订单
-
@param strategy 传入优惠策略
*/
public static void usePromotion(Order order, PromotionStrategy strategy) {
Promotion getPromotion = promotionMap.get(strategy);
getPromotion.doPromotion(order);
}
}
复制代码
可见,首先这个类中会把所有的优惠策略都实例化一遍并存入到一个Map
中,每个优惠策略对应我们一个策略枚举值作为key
,然后利用usePromotion
方法,可以接受从客户端传来的优惠策略参数,然后选择相应的优惠策略。
可见,策略模式就是将选择策略的逻辑抽离到一个专门的类中,客户端就可以通过传参的形式更加灵活方便地选择策略。
我们来试一下子:
package fun.swsk33site.strategy;
import fun.swsk33site.strategy.model.Order;
import fun.swsk33site.strategy.promotion.Promotion;
import fun.swsk33site.strategy.promotion.PromotionContext;
import fun.swsk33site.strategy.promotion.PromotionStrategy;
import fun.swsk33site.strategy.promotion.impl.CashBackPromotion;
import fun.swsk33site.strategy.promotion.impl.FullDiscountPromotion;
import fun.swsk33site.strategy.promotion.impl.NoPromotion;
public class Client {
/**
-
客户端进行支付
-
@param order 待支付账单
-
@param strategy 要使用的优惠策略
*/
private static void doPayment(Order order, PromotionStrategy strategy) {
System.out.println(“账单:” + order.getName() + “准备支付”);
System.out.println(“准备使用优惠”);
PromotionContext.usePromotion(order, strategy);
System.out.println(“支付完成:” + order.getPrice() + “元”);
}
public static void main(String[] args) {
// 模拟买东西
Order order = new Order();
order.setName(“守望时空33购买的辛鹿咖啡豆:曼特宁拼配 深度烘焙1kg,意式极深炭烧 极深烘焙1kg,云南阿拉比卡庄园豆 深度烘焙454g”);
order.setPrice(202);
// 进行支付,使用满减优惠策略
doPayment(order, PromotionStrategy.FULLDISCOUNT);
}
}
复制代码
结果:
只需在进行支付的时候,调用策略选择类,利用枚举值传参,根据传参使用不同的优惠策略。
其实也可以不使用枚举传参,直接使用字符串或者常量等等方式都可以,不过枚举传参我认为可以降低错误的可能,实用一些。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
14884181399)]
[外链图片转存中…(img-oMME2q0N-1714884181399)]
[外链图片转存中…(img-wHNArSed-1714884181399)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!