当前位置: 首页 > article >正文

策略模式是一种行为设计模式

策略模式是一种行为设计模式,允许你定义一系列算法、封装每一个算法,并使它们可以相互替换。

策略模式使得算法的变化独立于使用算法的客户端。以下是一个用策略模式实现不同类型促销活动的 Java 示例。

步骤

定义促销策略接口:创建一个接口,定义促销活动的方法。
实现具体策略:根据不同的促销活动实现该接口。
上下文类:创建一个上下文类,用于设置和执行具体的促销策略。
客户端代码:使用上下文类和不同的促销策略。

1. 定义促销策略接口

public interface PromotionStrategy {
    void applyPromotion();
}
  1. 实现具体促销策略
// 满减促销
public class FullReductionStrategy implements PromotionStrategy {
    @Override
    public void applyPromotion() {
        System.out.println("Apply full reduction: Spend \$100, get \$20 off.");
    }
}

// 打折促销
public class DiscountStrategy implements PromotionStrategy {
    @Override
    public void applyPromotion() {
        System.out.println("Apply discount: Get 15% off on all items.");
    }
}

// 限时促销
public class LimitedTimeStrategy implements PromotionStrategy {
    @Override
    public void applyPromotion() {
        System.out.println("Limited time offer: Buy 2 get 1 free!");
    }
}

3.管理类

public class PromotionContext {
    private PromotionStrategy promotionStrategy;

    public PromotionContext(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }

    public void setPromotionStrategy(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }

    public void executePromotion() {
        promotionStrategy.applyPromotion();
    }
}
  1. 主类
public class Main {
    public static void main(String[] args) {
        // 使用满减促销
        PromotionContext promotionContext = new PromotionContext(new FullReductionStrategy());
        promotionContext.executePromotion();

        // 更改为打折促销
        promotionContext.setPromotionStrategy(new DiscountStrategy());
        promotionContext.executePromotion();

        // 更改为限时促销
        promotionContext.setPromotionStrategy(new LimitedTimeStrategy());
        promotionContext.executePromotion();
    }
}

运行结果
运行上述代码,将会输出以下内容:


Apply full reduction: Spend \$100, get \$20 off.
Apply discount: Get 15% off on all items.
Limited time offer: Buy 2 get 1 free!

PromotionStrategy:这是一个策略接口,定义了一个applyPromotion方法,具体的促销策略将实现这个接口。
具体策略类:FullReductionStrategy、DiscountStrategy和LimitedTimeStrategy是不同的促销策略的具体实现。
PromotionContext:上下文类,它持有一个策略的引用并提供一个方法来执行这个策略。 Main
类:客户端代码,它创建了一个上下文并使用不同的促销策略执行促销活动。

优点

1.提高了灵活性:

策略模式使得算法可以独立于使用它的客户端而变化。你可以在运行时动态地更换策略,无需修改客户端代码。

2.清晰的职责分离:

每种策略都封装在自己的类中,符合单一职责原则。这样,可以将复杂的逻辑从客户端分离出来,增强了代码的可维护性。

3.可扩展性强:

新的策略可以通过创建新的策略类来添加,而不需要修改现有的代码。这符合开闭原则,即对扩展开放,对修改关闭。

4.简化了复杂的条件语句:

使用策略模式可以消除复杂的条件语句(如 if…else 或 switch),使代码更简洁、更易读。

5.增强了代码的可测试性:

因为每个策略都在单独的类中,可以更容易地对每种策略进行单元测试。
缺点

1.增加了类的数量:

每个策略都需要创建一个新的类,这会导致类的数量激增,可能导致系统变得复杂。

2.客户端必须了解不同的策略:

客户端需要了解所有可用策略的功能和使用方法,这可能会增加使用的复杂性。

3.适用于较简单的场景:

策略模式更适用于算法较少变化的场景,如果算法频繁变动,可能会导致频繁修改策略类。

4.不适合用于相似的算法:

如果不同的策略之间的差异很小,使用策略模式可能会导致过度设计,并引入不必要的复杂性。

策略模式(Strategy Pattern)适用于以下场合:
  1. 需要多种算法或行为的场景
    当你有多个相似的算法或操作,而需要在运行时选择其中一种时,策略模式非常合适。例如,支付系统中可能会有多种支付方式(如信用卡、PayPal、支付宝),可以使用策略模式来实现。

2. 避免使用条件语句
当代码中存在大量的 if…else 或 switch 语句来选择算法或行为时,可以考虑使用策略模式。通过将不同的算法封装到不同的策略类中,可以使代码更加清晰易读。

3. 算法的变化不影响客户端
当你希望算法或行为的变化不影响使用它的客户端代码时,策略模式可以提供很好的支持。例如,如果算法需要经常更新或替换,可以在不修改客户端代码的情况下实现。

4. 希望动态切换算法
在某些情况下,可能需要根据不同的条件动态选择算法。在这种情况下,策略模式允许在运行时切换策略,以便适应不同的需求或环境。

5. 实现缓存或回调机制
当不同的策略需要在不同的条件下执行时,策略模式可以提供灵活性。比如在网络请求中,根据不同的请求类型使用不同的处理策略。

6. 需要对行为进行扩展
当你希望系统在不修改现有代码的情况下扩展新的行为或算法时,策略模式提供了一种方便的方式。通过添加新的策略类,可以轻松地扩展系统的功能。

7. 遵循开闭原则
如果你的设计需求遵循开闭原则,即对扩展开放,对修改关闭,策略模式是一种理想的选择。你可以通过添加新的策略类而不是修改现有的代码来扩展系统功能。


http://www.kler.cn/news/362818.html

相关文章:

  • 快速搭建SpringBoot3+Prometheus+Grafana
  • VirtualBox虚拟机桥接模式固定ip详解
  • 【Origin科技绘图】最新Origin2024中文版软件安装教程
  • Centos7 将man手册内容转换为txt,pdf访问,并汉化
  • scrapy的xpath在控制台可以匹配,但是到了代码无法匹配(无法匹配tbody标签)
  • 《重置MobaXterm密码并连接Linux虚拟机的完整操作指南》
  • 基于neo4j知识图谱的菜谱推荐系统
  • OpenAI“草莓”大模型登场!先行者云科技一键体验
  • 驱动-----内核启动
  • C 语言入门教程
  • STM32(二十一):看门狗
  • VirtualBox虚拟机桥接模式固定ip详解
  • ARM/Linux嵌入式面经(五十):tp普联
  • HeterGCL 论文写作分析
  • C语言汇编概述
  • R语言机器学习算法实战系列(十)自适应提升分类算法 (Adaptive Boosting)
  • SCR相对标准偏差、氨氮比、截面速度,多平面计算
  • WIFI、NBIOT、4G模块调试AT指令连接华为云物联网服务器(MQTT协议)
  • 基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • int argc, char *argv[]
  • Pr 视频效果:时间
  • 刷题 - 图论
  • 哥德巴赫猜想渐行渐远
  • 软件分享丨Marktext 编辑器
  • 如何在复杂的信息物理系统中实施风险管理
  • leetcode 无重复字符串的排列和组合