Java 设计模式 - 策略模式

发布于 2024-08-28 03:02:57 字数 3183 浏览 15 评论 0

策略模式(Strategy): 定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类)即使用策略(指定一个策略或者使用默认策略) 的上下文

它实际上指,在一个方法中,流程是确定的,但是,某些关键步骤的算法依赖调用方传入的策略,这样,传入不同的策略,即可获得不同的结果,大大增强了系统的灵活性。

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

策略模式的核心思想是在一个计算方法中把容易变化的算法抽出来作为“策略”参数传进去,从而使得新增策略不必修改原有逻辑。通过扩展策略,不必修改主逻辑,即可获得新策略的结果。

策略模式在 Java 标准库中应用非常广泛,如 Arrays.sort(T[] a, Comparator<? super T> c), 通过传入不同的 Comparator 实现不同的排序算法就是一种非常典型的策略模式

实现

实现商品折扣计算

┌───────────────┐      ┌─────────────────┐
│DiscountContext│─ ─ ─>│DiscountStrategy │
└───────────────┘ └─────────────────┘

│ ┌─────────────────────┐
├─│ VipDiscountStrategy │
│ └─────────────────────┘
│ ┌─────────────────────┐
└─│OverDiscountStrategy │
└─────────────────────┘
/**
* 折扣策略
*/
public interface DiscountStrategy {

BigDecimal getDiscount(BigDecimal total);

}

/**
* 会员折扣策略
*/
public class VipDiscountStrategy implements DiscountStrategy {

@Override
public BigDecimal getDiscount(BigDecimal total) {
//会员打 8 折
return total.multiply(new BigDecimal("0.2")).setScale(2, RoundingMode.DOWN);
}
}

/**
* 满减折扣策略
*/
public class OverDiscountStrategy implements DiscountStrategy{
@Override
public BigDecimal getDiscount(BigDecimal total) {
// 满 100 减 20 优惠:
return total.compareTo(BigDecimal.valueOf(100)) >= 0 ? BigDecimal.valueOf(20) : BigDecimal.ZERO;
}
}

/**
* 折扣策略上下文
*/
public class DiscountStrategyContext {

//设置默认策略
private DiscountStrategy strategy = new OverDiscountStrategy();

public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}

public BigDecimal calculatePrice(BigDecimal total) {
return total.subtract(this.strategy.getDiscount(total)).setScale(2);
}
}

/**
* 策略模式测试类
*/
public class DiscountStrategyTest {

public static void main(String[] args) {
DiscountStrategyContext discountStrategyContext = new DiscountStrategyContext();

BigDecimal bigDecimal1 = discountStrategyContext.calculatePrice(new BigDecimal(105));
System.out.println("使用默认策略(满 100 减 20) 时: " + bigDecimal1);

//修改使用会员策略
discountStrategyContext.setStrategy(new VipDiscountStrategy());
BigDecimal bigDecimal2 = discountStrategyContext.calculatePrice(new BigDecimal(105));
System.out.println("使用会员策略时: " + bigDecimal2);
}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

第几種人

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

emdigitizer10

文章 0 评论 0

残龙傲雪

文章 0 评论 0

奢望

文章 0 评论 0

微信用户

文章 0 评论 0

又爬满兰若

文章 0 评论 0

独孤求败

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文