首页 > 其他分享 >策略模式是一种行为设计模式

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

时间:2024-10-18 16:47:03浏览次数:8  
标签:策略 促销 模式 算法 设计模式 public 客户端

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

策略模式使得算法的变化独立于使用算法的客户端。以下是一个用策略模式实现不同类型促销活动的 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. 遵循开闭原则
如果你的设计需求遵循开闭原则,即对扩展开放,对修改关闭,策略模式是一种理想的选择。你可以通过添加新的策略类而不是修改现有的代码来扩展系统功能。

标签:策略,促销,模式,算法,设计模式,public,客户端
From: https://blog.csdn.net/qq_46091953/article/details/143030644

相关文章

  • 前端开发设计模式——状态模式
    目录一、状态模式的定义和特点二、状态模式的结构与原理1.结构:2.原理:三、状态模式的实现方式四、状态模式的使用场景1.按钮的不同状态:2.页面加载状态:3.用户登录状态:五、状态模式的优点1.提高代码的可维护性:2.增强代码的可读性:3.更好的处理动态变化:六、状态模式的......
  • ArkWeb高级安全模式 - 提升应用安全性
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介ArkWeb框架的高级安全模式为开发......
  • 轻松上手-MVVM模式_关系型数据库_云函数T云数据库
    作者:狼哥团队:坚果派团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁夏等地,目前已开发鸿蒙原......
  • UIAbility组件启动模式
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • 优秀图书推荐《单元测试:原则、模式和实践》与要点解析
    一.单元测试历史背景     单元测试在软件开发中已经存在了几十年,但直到21世纪初,它才成为软件开发过程中的一个标准实践。随着敏捷开发方法的兴起,单元测试变得更加重要,因为它支持快速迭代和持续集成。VladimirKhorikov的书《单元测试:原则、模式和实践UnitTesting:Principl......
  • 制定经营目标并纳入绩效考核的有效运营策略
    在今竞争激烈的商业环境中,企业要想取得长期成功,就必须制定明确的经营目标,并将其纳入绩效考核体系中。本文将探讨为什么制定经营目标是重要的,如何有效地制定和实施这些目标,并将其与绩效考核相结合,以实现企业的长期成功。一、为什么制定经营目标是重要的提供方向和焦点:经营目标为......
  • 邮件营销标题策略:提升邮件打开率的秘诀?
    邮件营销标题的优化指南?如何写好EDM邮件营销的标题?如何确保你的邮件能够脱颖而出,吸引读者的注意力,成为了一个关键问题。邮件营销标题策略是提升邮件打开率的关键,MailBing将深入探讨如何通过有效的标题策略来提高邮件的打开率。邮件营销标题:使用数字数字和数据能够为邮件营......
  • 单例模式
    单例模式单例模式:每次实例化对象都是用的同一个内存地址【第一个对象】。基于模块导入实现基于面向对象实现手撕一个单例模式示例:importthreadingclassSingleton:instance=Nonelock=threading.RLock()def__init__(self,name):self.n......
  • 【设计模式】适配器模式
    设计模式【设计模式】工厂方法模式【设计模式】抽象工厂模式【设计模式】单例模式【设计模式】策略模式【设计模式】观察者模式【设计模式】装饰模式【设计模式】适配器模式 一、介绍适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。适配器可......
  • YOLO的正负样本分配策略
    在目标检测中,正负样本分配策略通常用于训练期间为每个样本分配一个权重,以便模型模型更加关注困难的样本和重要的样本。静态分配策略在训练开始之前确定的,固定为一组预先定义的权重,这些权重不会在训练过程中改变,这种分配策略通常基于经验得出。不够灵活,可能无法充分利用样本......