【设计模式|行为型】策略模式(Strategy Pattern)

概述

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族(一组算法),分别封装起来,使它们之间可以互相替换,而且算法的变化可以独立于使用它的客户端。策略模式通常涉及到两个角色:策略接口和具体策略实现类。客户端使用策略接口调用具体策略实现类的方法,从而实现不同的行为。

优点:

  • 策略模式将算法的实现与使用分离开来,使得各个算法的实现可以独立变化,增加新的算法只需要实现策略接口即可,不会对其他算法造成影响。
  • 策略模式通过封装算法,使得客户端无需知道算法的具体实现细节,降低了客户端的复杂性。
  • 策略模式利用组合,解决了继承带来的问题,更加灵活。

缺点:

  • 策略模式会增加系统中策略类的数量,增加了代码的复杂度。
  • 如果客户端需要经常切换策略,那么会带来一定的系统开销。

使用场景:

  • 当需要根据不同的条件来执行不同的算法时,可以使用策略模式。
  • 当一个类有多个行为,且这些行为在不同的场景下有不同的实现时,可以使用策略模式。
  • 当需要实现算法的变化不影响客户端使用时,可以使用策略模式。

示例

 一个常见的场景就是商场打折活动,不同的活动有不同的折扣策略。例如,周末活动有全场八折,VIP会员有九折等等。这些折扣策略可以看作是不同的算法,商场可以通过策略模式来实现灵活的配置。

下面是一个简单的示例代码,模拟了商场打折活动。DiscountStrategy 是策略接口,PercentageDiscountStrategy 和 FixedAmountDiscountStrategy 是具体的策略实现类,Client 是客户端代码,用来指定折扣策略。

// 策略接口
interface DiscountStrategy {
    double applyDiscount(double totalPrice);
}

// 具体策略实现类:按比例打折
class PercentageDiscountStrategy implements DiscountStrategy {
    private double discountPercentage;

    public PercentageDiscountStrategy(double discountPercentage) {
        this.discountPercentage = discountPercentage;
    }

    @Override
    public double applyDiscount(double totalPrice) {
        return totalPrice * (1 - discountPercentage);
    }
}

// 具体策略实现类:减去固定金额
class FixedAmountDiscountStrategy implements DiscountStrategy {
    private double fixedAmount;

    public FixedAmountDiscountStrategy(double fixedAmount) {
        this.fixedAmount = fixedAmount;
    }

    @Override
    public double applyDiscount(double totalPrice) {
        return totalPrice - fixedAmount;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        double totalPrice = 100;
        DiscountStrategy strategy = new PercentageDiscountStrategy(0.2);
        double discountedPrice = strategy.applyDiscount(totalPrice);
        System.out.println("折扣后的价格:" + discountedPrice);

        strategy = new FixedAmountDiscountStrategy(20);
        discountedPrice = strategy.applyDiscount(totalPrice);
        System.out.println("折扣后的价格:" + discountedPrice);
    }
}

输出结果:

折扣后的价格:80.0

折扣后的价格:80.0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值