博客博客
  • 介绍
  • 链表反转
  • 排序算法
  • 二叉树

    • 介绍
    • 深度算法
  • 加密算法

    • 非对称加密
    • 摘要算法
    • 对称加密
  • 激活Windows 11
  • ASP.NET Core 健康检查
  • 获取程序集根目录
  • 闭包
  • CSS 单位指南:CSS em、rem、vh、vw 等详解
  • 自定义Code First约定
  • .NET安装本地化的智能提示
  • 免费开通域名企业邮箱
  • GRPC
  • Hexo生成github page
  • .Net Core日志管理之Log4net
  • linux下更新jenkins
  • MySQL的四种事务隔离级别
  • 发布NuGet包
  • rimraf命令
  • Ubuntu基础操作
  • Ubuntu安装jenkins
  • Vscode无法执行npm等脚本的问题
  • Json

    • Countries
  • 简介
  • 设计原则
  • 行为型模式

    • 介绍
    • 策略模式
  • 创建型模式

    • 介绍
    • 单例模式
  • 结构型模式

    • 介绍
  • Docker指南

    • 介绍
    • 安装
  • Docker实例

    • 介绍
    • docker安装consul
    • docker安装elasticsearch
    • docker安装gitlab-runner
    • docker安装gitlab
    • docker安装jenkins
    • docker安装kafka
    • docker安装mongo
    • docker安装mysql
    • docker安装nginx
    • docker安装portainer
    • docker安装rabbitmq
    • docker安装redis
    • docker安装teamcity
  • Docker教程

    • Docker命令大全
    • docker nginx添加端口映射
    • docker服务管理
  • Docker-Compose

    • 网络配置
    • service name和container name
  • 世界上的另一个我
  • 计划生育宣传标语
  • IT术语
  • Single is simple, double is trouble
  • 矿泉水、纯净水、天然水究竟有啥区别
  • 联系
  • 捐赠
GitHub
  • 介绍
  • 链表反转
  • 排序算法
  • 二叉树

    • 介绍
    • 深度算法
  • 加密算法

    • 非对称加密
    • 摘要算法
    • 对称加密
  • 激活Windows 11
  • ASP.NET Core 健康检查
  • 获取程序集根目录
  • 闭包
  • CSS 单位指南:CSS em、rem、vh、vw 等详解
  • 自定义Code First约定
  • .NET安装本地化的智能提示
  • 免费开通域名企业邮箱
  • GRPC
  • Hexo生成github page
  • .Net Core日志管理之Log4net
  • linux下更新jenkins
  • MySQL的四种事务隔离级别
  • 发布NuGet包
  • rimraf命令
  • Ubuntu基础操作
  • Ubuntu安装jenkins
  • Vscode无法执行npm等脚本的问题
  • Json

    • Countries
  • 简介
  • 设计原则
  • 行为型模式

    • 介绍
    • 策略模式
  • 创建型模式

    • 介绍
    • 单例模式
  • 结构型模式

    • 介绍
  • Docker指南

    • 介绍
    • 安装
  • Docker实例

    • 介绍
    • docker安装consul
    • docker安装elasticsearch
    • docker安装gitlab-runner
    • docker安装gitlab
    • docker安装jenkins
    • docker安装kafka
    • docker安装mongo
    • docker安装mysql
    • docker安装nginx
    • docker安装portainer
    • docker安装rabbitmq
    • docker安装redis
    • docker安装teamcity
  • Docker教程

    • Docker命令大全
    • docker nginx添加端口映射
    • docker服务管理
  • Docker-Compose

    • 网络配置
    • service name和container name
  • 世界上的另一个我
  • 计划生育宣传标语
  • IT术语
  • Single is simple, double is trouble
  • 矿泉水、纯净水、天然水究竟有啥区别
  • 联系
  • 捐赠
GitHub
  • 设计模式

    • 简介
    • 设计原则
  • 行为型模式

    • 介绍
    • 策略模式
  • 创建型模式

    • 介绍
    • 单例模式
  • 结构型模式

    • 介绍

策略模式

个人理解,策略模式并不能解决if-else问题,而只是为了遵循设计原则做出的一种设计,不要被网上很多讲解的教程给误导了

策略接口

/// <summary>
/// 优惠券
/// </summary>
public abstract class Coupon
{
    public abstract decimal SettleAccount(decimal amount);
}

策略实现

折扣策略

/// <summary>
/// 折扣券
/// </summary>
public class DiscountCoupon : Coupon
{
    public override decimal SettleAccount(decimal amount)
    {
        return amount * 0.8m;
    }
}

满减策略

/// <summary>
/// 满减券
/// </summary>
public class FullReductionCoupon : Coupon
{
    public override decimal SettleAccount(decimal amount)
    {
        if (amount >= 300)
            amount -= 100;

        return amount;
    }
}

策略上下文

/// <summary>
/// 优惠券策略上下文
/// </summary>
public class CouponContext
{
    private readonly Coupon _coupon;

    public CouponContext(Coupon coupon)
    {
        this._coupon = coupon;
    }

    public decimal GetAmount(decimal amount)
    {
        return this._coupon.SettleAccount(amount);
    }
}

策略调用

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"策略模式优惠券计算方式");
        var context = new CouponContext(new FullReductionCoupon());
        var payableAmount = 300;
        var actuallyPayAmount = context.GetAmount(payableAmount);
        Console.WriteLine($"应付金额为:{payableAmount},使用满减券实际支付金额为:{actuallyPayAmount}");

        context = new CouponContext(new DiscountCoupon());
        actuallyPayAmount = context.GetAmount(payableAmount);
        Console.WriteLine($"应付金额为:{payableAmount},使用折扣券实际支付金额为:{actuallyPayAmount}");
    }
}
Prev
介绍