工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它==解耦的是策略的定义、创建、使用这三部分==
这里实现一个计算订单价格的策略,商品可能会做各种活动,每种活动折扣都不一样,这里通过策略模式实现,代码简洁,以后增加活动的时候不需要修改原有代码。
/**
* 策略定义
*
* @Author: prepared
* @Date: 2021/6/21 15:04
*/
public interface DiscountStrategy {
double calDiscount(Order order);
}
GrouponDiscountStrategy、PromotionDiscountStrategy 具体实现都一致,这里就不写了。
@Service
public class NormalDiscountStrategy implements PushStrategyI{
private Logger logger = LoggerFactory.getLogger(NormalDiscountStrategy.class);
@Override
public Response calDiscount(Long userId) {
}
}
这里也可以将具体的策略通过属性注入进来,获取策略的方法,通过if/else判断获取对应的策略。
/**
* 使用工厂模式 创建策略
*
* @Author: prepared
* @Date: 2021/6/21 15:04
*/
public class DiscountStrategyFactory {
private static final Map<OrderType, DiscountStrategy> strategies = new HashMap<>();
static {
strategies.put(OrderType.NORMAL, new NormalDiscountStrategy());
strategies.put(OrderType.GROUPON, new GrouponDiscountStrategy());
strategies.put(OrderType.PROMOTION, new PromotionDiscountStrategy());
}
public static DiscountStrategy getDiscountStrategy(OrderType type) {
return strategies.get(type);
}
}
/**
* 策略的使用
*
* @Author: prepared
* @Date: 2021/6/21 15:04
*/
public class OrderService {
public double discount(Order order) {
OrderType type = order.getType();
DiscountStrategy discountStrategy = DiscountStrategyFactory.getDiscountStrategy(type);
return discountStrategy.calDiscount(order);
}
}
最常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断。策略模式适用于根据不同类型的动态,决定使用哪种策略这样一种应用场景。
策略模式主要的作用还是解耦策略的定义、创建和使用,控制代码的复杂度,让每个部分都不至于过于复杂、代码量过多。
商城推广的时候,有的需求是给用户发短信,有的需求给用户打电话,还有的需求是给用户发送微信通知消息或者其他通知。
在这里使用策略模式,代码简洁,而且方便扩展其他策略,比如以后需要钉钉通知消息、用户精准广告等等测试。
否则每次增加需求的时候,都需要大规模修改原有代码,与设计原则【对扩展开放,对修改关闭】不符。
前言 Canvas绘制多变形非常简单,只要懂得Canvas路径 + 简单的初中数学知识即可...
1.先瞧瞧效果: 2.代码是这样的: img src=images/circle.png alt= id=circle/@m...
作者:Joe Seifi 译者:前端小智 移动: https://mp.weixin.qq.com/s/p5... 有梦...
1、纯工具操作步骤,懂代码更容易 划线就是不符合国人的审美观念,看着就别扭,...
在默认情况之下,如果在Canvas之中将某个物体(源)绘制在另一个物体(目标)之...
简介: 6月4日,以“开启分布式云新时代”为主题2021云边协同大会在北京举行,本...
本文没有咬文嚼字的地方,只是一个配色技巧的分享,十分简单,简单到流泪,但或...
折叠式卡片布局在PC版网站中可能不常见,但是在手机版,小屏幕的网页浏览会大发...
一、虽然有的属性是boolean类型,但仍旧建议按照XHTML书写(属性名=属性值)格式...
背景 在公司参与一个原生APP和h5混合开发的项目,本人在项目中负责h5部分,现将...