首页 > 其他分享 >设计模式-策略模式

设计模式-策略模式

时间:2025-01-08 17:01:45浏览次数:1  
标签:策略 double ShoppingCart 模式 算法 originalPrice 设计模式 public

策略模式(Strategy Pattern) 是一种行为型设计模式,它允许定义一系列算法(或策略),并将每个算法封装起来,使得它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端。

策略模式的关键要点:

  1. 上下文(Context):持有一个策略对象,并且通过调用策略对象的方法来执行特定的算法或操作。
  2. 策略接口(Strategy):定义一系列的算法接口。
  3. 具体策略(ConcreteStrategy):实现策略接口的具体算法。

适用场景:

  • 有多种算法或行为时,希望根据不同情况选择不同的算法。
  • 你需要对算法进行独立的扩展,不想改变客户端的代码。
  • 需要避免在客户端类中使用复杂的条件语句来决定不同的行为。

具体步骤:

  1. 定义一个策略接口(Strategy),声明一个算法方法。
  2. 创建多个具体策略类(ConcreteStrategy),实现该接口并提供具体的算法实现。
  3. 创建一个上下文类(Context),它持有一个策略对象,并委托策略对象执行具体的算法。

代码示例

假设我们有一个计算购物车总价格的需求,购物车可以选择不同的打折策略:满减策略、折扣策略、无折扣策略。

1. 定义策略接口

// 策略接口:定义一个计算价格的方法
public interface PricingStrategy {
    double calculatePrice(double originalPrice);
}

2. 创建具体策略类

// 具体策略1:满减策略
public class DiscountStrategy implements PricingStrategy {
    private double discount;

    public DiscountStrategy(double discount) {
        this.discount = discount;
    }

    @Override
    public double calculatePrice(double originalPrice) {
        return originalPrice - discount;
    }
}

// 具体策略2:折扣策略
public class PercentageDiscountStrategy implements PricingStrategy {
    private double percentage;

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

    @Override
    public double calculatePrice(double originalPrice) {
        return originalPrice * (1 - percentage / 100);
    }
}

// 具体策略3:无折扣策略
public class NoDiscountStrategy implements PricingStrategy {
    @Override
    public double calculatePrice(double originalPrice) {
        return originalPrice;
    }
}

3. 创建上下文类

// 上下文类:持有一个策略对象
public class ShoppingCart {
    private PricingStrategy pricingStrategy;

    public ShoppingCart(PricingStrategy pricingStrategy) {
        this.pricingStrategy = pricingStrategy;
    }

    // 设置策略
    public void setPricingStrategy(PricingStrategy pricingStrategy) {
        this.pricingStrategy = pricingStrategy;
    }

    // 计算价格
    public double calculateTotalPrice(double originalPrice) {
        return pricingStrategy.calculatePrice(originalPrice);
    }
}

4. 客户端代码使用策略模式

public class Main {
    public static void main(String[] args) {
        double originalPrice = 200.0;

        // 使用满减策略
        ShoppingCart cart1 = new ShoppingCart(new DiscountStrategy(20.0));
        System.out.println("总价(满减策略): " + cart1.calculateTotalPrice(originalPrice));

        // 使用折扣策略
        ShoppingCart cart2 = new ShoppingCart(new PercentageDiscountStrategy(10.0));
        System.out.println("总价(折扣策略): " + cart2.calculateTotalPrice(originalPrice));

        // 使用无折扣策略
        ShoppingCart cart3 = new ShoppingCart(new NoDiscountStrategy());
        System.out.println("总价(无折扣策略): " + cart3.calculateTotalPrice(originalPrice));
    }
}

输出:

总价(满减策略): 180.0
总价(折扣策略): 180.0
总价(无折扣策略): 200.0

解释:

  1. 策略接口 PricingStrategy 定义了一个方法 calculatePrice(double originalPrice),用于计算价格。
  2. 具体策略类
    • DiscountStrategy 实现了满减策略。
    • PercentageDiscountStrategy 实现了折扣策略。
    • NoDiscountStrategy 实现了无折扣策略。
  3. 上下文类 ShoppingCart 持有一个 PricingStrategy 的引用,它在执行 calculateTotalPrice 时委托给具体的策略对象来计算价格。
  4. 在客户端代码中,通过传递不同的策略对象(如 DiscountStrategyPercentageDiscountStrategy 等)来改变计算价格的方式,避免了在 ShoppingCart 类中写大量的条件语句来判断使用哪种策略。

优点:

  • 算法的独立性:每个具体策略都封装在独立的类中,策略的改变不会影响其他类的实现。
  • 避免了复杂的条件判断:客户端不需要在代码中处理复杂的条件判断,策略的选择和改变变得更加灵活。
  • 可扩展性:可以方便地增加新的策略,不需要修改现有代码,只需实现新的策略类。

缺点:

  • 类的数量增多:每一种策略都需要一个新的类,可能会导致类的数量增多。
  • 客户端需要了解所有的策略类:客户端需要了解所有的策略类型,因此有时可能会导致策略模式的使用不够简洁。

总结:

策略模式通过将不同的算法或行为封装在不同的策略类中,使得算法或行为可以在运行时动态切换,而不需要改变客户端代码的实现。它是一个非常有用的设计模式,尤其在涉及多种变体的算法时,能有效避免复杂的条件判断语句。

 

标签:策略,double,ShoppingCart,模式,算法,originalPrice,设计模式,public
From: https://www.cnblogs.com/pangchunlei/p/18660115

相关文章

  • 状态机轮转的偶发性bug举例与修复策略
    //场景1:状态检查和更新不是原子操作,导致竞态条件publicclassRaceConditionBug{privatevolatileTaskStatestate=TaskState.PENDING;//问题代码publicvoidprocessTaskWithBug(StringtaskId){//检查和更新之间可能有其他线程修改......
  • DP系列时间服务器,支持多模式高精度授时,快速实现跟踪锁定
    DP系列时间服务器,支持多模式高精度授时,快速实现跟踪锁定,保持能力业界领先。产品适用于室内、室外、主时钟、从时钟、边界时钟等不同应用场景。应用通信网络:移动通信基站、承载网设备等轨道交通:地铁、高铁、轻轨等专网通信电力:运行调度、故障定位、电力通信网络等其他:公安、税......
  • C++二十三种设计模式之观察者模式
    C++二十三种设计模式之观察者模式一、组成二、目的三、缺点四、示例代码一、组成抽象主题:维护观察者对象列表,具备通知功能。具体主题:实现维护观察者对象列表具体策略和通知功能。抽象观察者:为主题类提供更新接口。具体观察者:实现更新接口。二、目的用于一个对象......
  • 问答网站回答内容优化:提升信息价值与用户满意度的策略
    在问答网站中,回答内容的质量直接关系到用户体验、信息价值以及网站的长期吸引力。一个精心策划和优化的回答,不仅能够迅速解决用户的问题,还能增强用户的信任度和忠诚度,推动网站的持续增长。本文将深入探讨问答网站回答内容优化的策略,旨在帮助运营者和回答者提升回答的质量,满足......
  • 强引蜘蛛:提升网站SEO效果的高级策略
    在搜索引擎优化(SEO)的世界里,“蜘蛛”是搜索引擎派出的自动程序,它们负责爬行和索引互联网上的网页。为了提升网站的SEO效果,让搜索引擎蜘蛛更有效地抓取和索引你的网站内容,实施一系列被称为“强引蜘蛛”的策略至关重要。本文将深入探讨这些高级策略,帮助网站管理员和内容创作者优......
  • 数据查询优化策略: 全聚合下推、分区剪枝、部分聚合下推以及动态数据迁移
    关于数据虚拟化在逻辑数据仓库(LogicalDataWarehouse)和逻辑数据湖(LogicalDataLake)架构中查询优化的实际应用示例。本文将为您详细介绍这些场景中最重要的优化技术,包括 全聚合下推(FullAggregationPushdown)、分区剪枝(PartitionPruning)、部分聚合下推(PartialAggregationP......
  • 新年新机遇:跨境电商选品策略大揭秘
    在进行跨境电商新年选品时,需要考虑多个因素以确保选品的成功,以下是一些关键步骤和策略:一、市场调研●了解目标市场:在进入跨境电商市场之前,必须深入了解目标市场的消费者群体,包括他们的生活习惯、文化背景、购买渠道以及对品牌和产品的兴趣。●分析消费趋势:新年期间,人们往往......
  • 如何通过数据分析优化电商营销策略和客户体验
    一、电商数据的收集电商平台的数据来源多样,包括用户行为数据、交易数据、客户反馈数据、商品信息数据等。高效的数据收集不仅是数据分析的前提,也是实现精准决策的基础。1.1数据收集的主要来源用户行为数据:用户在电商平台上的每一次点击、浏览、搜索、加入购物车、下单等行为,都......
  • 启航数据结构算法之绮旅,漫步C++智慧之道——LeetCode题海探幽:轮转数组之多元策略演绎
    人无完人,持之以恒,方能见真我!!!共同进步!!文章目录复杂度练习之轮转数组方法1方法2方法3总结复杂度练习之轮转数组题目链接:轮转数组为什么我们把这道题作为复杂度的练习题呢?是因为我们以后做题都会涉及到复杂度的计算,我们要保证我们写的程序不会超出题目的时间......
  • 11.03实验5:建造者模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解建造者模式的动机,掌握该模式的结构; 2、能够利用建造者模式解决实际问题。[实验任务一]:计算机组装 使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起构成计算机,......