首页 > 其他分享 >16_策略模式

16_策略模式

时间:2024-03-14 09:22:43浏览次数:14  
标签:策略 16 double 模式 算法 money 收费 public

策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到独立的类中,使它们可以互相替换。策略模式使得算法可以独立于客户端而变化,客户端可以根据需要选择不同的算法。

策略模式有三个主要角色:

  1. 环境类(Context):它持有一个策略对象的引用,并在需要的时候调用策略对象的方法。环境类可以根据需要动态地替换策略对象。

  2. 抽象策略类(Strategy):定义了策略的抽象接口,通常包含一个或多个策略方法。

  3. 具体策略类(Concrete Strategy):实现了抽象策略接口,提供具体的算法实现。

策略模式的工作原理如下:

  1. 环境类持有一个策略对象的引用,并在需要的时候调用策略对象的方法。

  2. 客户端根据需要选择具体的策略类,并将其传递给环境类。

  3. 环境类根据传入的策略对象,调用相应的策略方法。

策略模式的优点包括:

  1. 提供了一种简洁的方式来封装和切换算法,使得算法可以独立于客户端变化。

  2. 可以避免使用大量的条件判断语句,提高了代码的可读性和可维护性。

  3. 可以通过继承和接口的方式扩展新的策略类。

策略模式适用于以下场景:

  1. 当多个类只有在算法或行为上有不同的情况下,可以使用策略模式。

  2. 当需要在运行时动态地选择不同的算法时,可以使用策略模式。

总结而言,策略模式通过将算法封装到独立的策略类中,使得算法可以独立于客户端变化。它提供了一种简洁的方式来切换和封装算法,提高了代码的可读性和可维护性。

 

案例场景:

在商场收银系统中,可以正常收费,即按照单价*数量得出价格,遇到活动时可以打折收费和返利收费,从而计算价格。

Strategy

/// <summary>
    /// 抽象策略角色
    /// </summary>
    public abstract class PayBase
    {
        /// <summary>
        /// 结算计算方式
        /// </summary>
        /// <param name="money"></param>
        /// <returns></returns>
        public abstract double Calc(double money);
    }

 

Concrete Strategy

/// <summary>
    /// 正常收费
    /// </summary>
    public class NormalPay : PayBase
    {
        public override double Calc(double money)
        {
            return money;
        }
    }
/// <summary>
    /// 折扣收费
    /// </summary>
    public class RebatePay : PayBase
    {
        private double rebate = 1;

        public RebatePay(double rebate)
        {
            if(rebate < 0 || rebate > 1)
            {
                throw new ArgumentException("折扣在0-1之间");
            }

            this.rebate = rebate;
        }

        public override double Calc(double money)
        {
            return money * rebate;
        }
    }
/// <summary>
    /// 满减收费
    /// </summary>
    public class SubtractPay : PayBase
    {
        public int level = 0;
        public int subMoney = 0;
        public SubtractPay(int level, int subMoney)
        {
            this.level = level;
            this.subMoney = subMoney;
        }

        public override double Calc(double money)
        {
            int v = (int)(money / level);
            return money - v * subMoney;
        }
    }

 

Context

/// <summary>
    /// 打折
    /// </summary>
    public class PayContext
    {
        private PayBase Pay = new NormalPay();

        public void SetPayMode(PayBase pay)
        {
            Pay = pay;
        }

        public double GetResult(double money)
        {
            return Pay.Calc(money);
        }
    }

 

调用

internal class Client
    {
        public void Start()
        {
            double sumMoney = 10 * 18.5;//数量*单价=总价
            double realMoney = 0;//最终支付费用

            Console.WriteLine($"应付:{sumMoney}");

            PayContext context = new PayContext();

            //正常收费
            realMoney = context.GetResult(sumMoney);
            Console.WriteLine($"正常收费:{realMoney}");

            //扣扣收费
            context.SetPayMode(new RebatePay(0.85));
            realMoney = context.GetResult(sumMoney);
            Console.WriteLine($"扣扣收费:{realMoney}");

            //满减收费
            context.SetPayMode(new SubtractPay(100,5));
            realMoney = context.GetResult(sumMoney);
            Console.WriteLine($"减收费:{realMoney}");

        }
    }
static void Main(string[] args)
        {
            new Client().Start();   

            Console.ReadKey();
        }

 

标签:策略,16,double,模式,算法,money,收费,public
From: https://www.cnblogs.com/MingQiu/p/18072085

相关文章

  • RedisCluster集群中的插槽为什么是16384个?
    RedisCluster集群中的插槽为什么是16384个?CRC16的算法原理。1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位,若该位为0左移一位,若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5.重复将所有输入数据操作完成以上步骤......
  • Java知识点之单例模式
    1、单例模式(BinarySearch)单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但......
  • 21_Java循环模式
    循环结构while循环do…while循环for循环在Java5中引入了一种主要用于数组的增强型for循环。while循环while是最基本的循环结构:While(布尔表达式){//循环内容}要求:只要布尔表达式为true,循环就会一直执行下去多数情况会让循环停止下来,需要一个让表达式失......
  • Win10开机进不了系统以及Win10系统进入安全模式解决方法
      今天小编和大家分享Win10开机进不了系统以及进入安全模式解决方法。欢迎大家关注收藏!Win10开机无法进入系统通常可以尝试以下解决方法:一.  进入启动设置界面,按下F4进入安全模式。二. 在安全模式下,按下“Win+R”组合键打开“运行”窗口,输入“msconfig”,点击“确定......
  • DevOps软件开发管理模式、CICD概念及其Jenkins使用
    一、什么是DevOpsDevOps是Develop与Operations的缩写,是开发和运营维护的总称。它是企业内开发、技术运营和质量保障这三方面工作的融合,用于促进开发、技术运营和质保部门之间的沟通、协作与整合。为巩固软件设计与开发结果,将开发、运维与测试结合一起,形成了DevOps软件开发管......
  • 跟着GPT学设计模式之桥接模式
    说明桥接模式,也叫作桥梁模式,英文是BridgeDesignPattern。在GoF的《设计模式》一书中,桥接模式是这么定义的:“Decoupleanabstractionfromitsimplementationsothatthetwocanvaryindependently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。”桥接模式......
  • 提速电商效果图云渲染:优势与策略
    云渲染为电商效果图提供了快速、高效的解决方案,利用其庞大的计算能力和并行处理优势,即便是复杂场景也能迅速渲染完成,大幅提高工作效率和加快产品上市节奏。一、电商效果图有什么用?电商效果图在电商行业中扮演着至关重要的角色,它不仅能够生动地展示产品的外观和特性,还能增强消费......
  • 1688 API商品详情接口与ERP系统应用
     API接口与ERP系统集成的应用主要包括数据同步、业务流程自动化和信息共享三个方面。数据同步:通过API接口,ERP系统可以与其他系统之间进行数据的交换和同步。比如,将销售订单从电商平台自动导入到ERP系统中,然后将发货信息同步回电商平台,实现订单管理的自动化。又如,将供应商的......
  • 1688中国站获得联系方式 API 返回值
    公共参数名称类型必须描述keyString是免费申请调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes,将调用缓存的数据,速度比较快result_typeString否[j......
  • Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器
    Prompt进阶3:LangGPT(构建高性能质量Prompt策略和技巧2)--稳定高质量文案生成器1.LangGPT介绍现有Prompt创建方法有如下缺点:缺乏系统性:大多是细碎的规则,技巧,严重依赖个人经验缺乏灵活性:对他人分享的优质prompt进行调整需要直接修改prompt内容缺乏交互友好性:优质promp......