策略模式在Java中的实现:挑战常规的设计思路

15 篇文章 0 订阅
6 篇文章 0 订阅

策略模式在Java中的实现:挑战常规的设计思路

大家好,我是城南。
[路漫漫其修远兮,吾将上下而求所]

你是不是觉得设计模式都是那些"高大上"的概念,离我们普通程序员的日常工作很远?今天,我就来挑战一下这种常规的思维,告诉你策略模式在Java中的实际应用,既实用又简单!

策略模式是什么鬼?

策略模式(Strategy Pattern)是一种行为设计模式,它允许你定义一系列算法,并将每一种算法封装起来,使得它们可以互相替换。通俗点说,策略模式让你可以在运行时选择不同的算法,而不用修改客户端代码。

那为什么要用策略模式呢?

想象一下,你在做一个电商系统,需要根据不同的会员等级(比如普通会员、银牌会员、金牌会员)来计算不同的折扣。如果你直接在代码中写多个if-else,不仅代码难看,而且一旦要添加新的会员等级,就必须修改原有代码,这简直就是“搬起石头砸自己的脚”!

策略模式的出现,就是为了优雅地解决这个问题。

策略模式的基本结构

在Java中实现策略模式,一般会有以下几个角色:

  1. 策略接口(Strategy):定义所有支持的算法的公共接口。
  2. 具体策略(ConcreteStrategy):实现策略接口,具体实现某个算法。
  3. 上下文(Context):持有一个策略接口的引用,调用具体策略的方法。

实战!Java中策略模式的实现

下面我们以一个会员折扣系统为例,来实现策略模式。

1. 定义策略接口

首先,我们定义一个策略接口DiscountStrategy,它包含一个计算折扣的方法:

public interface DiscountStrategy {
    double calculateDiscount(double price);
}
2. 实现具体策略

接下来,我们实现几个具体的折扣策略,比如普通会员、银牌会员和金牌会员的折扣策略:

public class RegularMemberStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        return price * 0.95; // 普通会员打95折
    }
}

public class SilverMemberStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        return price * 0.9; // 银牌会员打9折
    }
}

public class GoldMemberStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        return price * 0.8; // 金牌会员打8折
    }
}
3. 定义上下文类

最后,我们定义一个上下文类MemberContext,它持有一个策略接口的引用:

public class MemberContext {
    private DiscountStrategy strategy;

    public MemberContext(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public double getDiscountPrice(double price) {
        return strategy.calculateDiscount(price);
    }

    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }
}
4. 使用策略模式

现在,我们可以在客户端代码中使用策略模式来计算不同会员的折扣了:

public class StrategyPatternDemo {
    public static void main(String[] args) {
        double price = 100.0;

        MemberContext context = new MemberContext(new RegularMemberStrategy());
        System.out.println("普通会员价格: " + context.getDiscountPrice(price));

        context.setStrategy(new SilverMemberStrategy());
        System.out.println("银牌会员价格: " + context.getDiscountPrice(price));

        context.setStrategy(new GoldMemberStrategy());
        System.out.println("金牌会员价格: " + context.getDiscountPrice(price));
    }
}

运行这段代码,你会发现不同会员的折扣价格都能正确计算出来,而且如果要新增一个会员等级,只需新增一个具体策略类,而不用修改现有代码,这简直就是“程序员的福音”!

策略模式的优缺点

当然,策略模式也不是完美无缺的。它的优点是:

  • 避免使用多重条件语句
  • 提供了更灵活的扩展性
  • 符合开闭原则

但同时,它的缺点也不容忽视:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略
  • 策略模式会增加类的数量

小结

通过这篇文章,我希望你对策略模式有了更深入的理解。策略模式不仅仅是一个“高大上”的设计模式,它在实际开发中也有广泛的应用。下次遇到类似的问题时,不妨试试用策略模式来解决,说不定会有意想不到的效果哦!

感谢你的阅读,希望你能关注我,城南。我们下期再见!


希望这篇文章对你有所帮助,了解更多编程技巧和设计模式的应用,欢迎持续关注我的博客。有什么问题或者建议,也可以在评论区留言,我们一起讨论进步!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值