策略模式

一、定义

定义一系列算法,把他们一个个封装起来,并且使他们可以互相替换。该模式使得算法可以独立于使用它的客户程序而变化。

二、UML类图

 

  • Context:策略上下文,持有IStrategy的引用,负责和具体的策略实现交互;

  • IStrategy:策略接口,约束一系列具体的策略算法;

  • ConcreteStrategy:具体的策略实现。

三、优点

  • 策略可以互相替换;
  • 解决switch-caseif-else带来的难以维护的问题;
  • 策略易于扩展,满足开闭原则。

四、缺点

  • 随着策略的扩展,策略类数量会增多;
  • 客户端必须知道每一个策略类,增加了使用难度。

五、应用场景

促销活动,日志、缓存等。

六、示例

促销活动的例子 现活动有春季活动和夏季活动

1.IPromotionStrategy.cs

    // 定义一个策略接口
    public interface IPromotionStrategy
    {
        double ApplyPromotion(double totalPrice);
    }

2.SpringPromotionStrategy.cs

public class SpringPromotionStrategy : IPromotionStrategy
    {
        public double ApplyPromotion(double totalPrice)
        {
            return totalPrice * 0.8;
        }
    }

3.SummerPromotionStrategy.cs

public class SummerPromotionStrategy : IPromotionStrategy
    {
        public double ApplyPromotion(double totalPrice)
        {
            return totalPrice * 0.9;
        }
    }

4.Order.cs

    // 订单类
    public class Order
    {
        private static readonly double totalPrice = 100;

        private IPromotionStrategy _promotionStrategy;

        // 构造函数中传入具体的策略对象
        public Order(IPromotionStrategy promotionStrategy)
        {
            _promotionStrategy = promotionStrategy;
        }

        // 计算折扣金额
        public double CalculateDiscount()
        {
            return _promotionStrategy.ApplyPromotion(totalPrice);
        }
    }

5.Program.cs

internal class Program
    {
        static void Main(string[] args)
        {
            var order1 = new Order(new SpringPromotionStrategy());
            var order2 = new Order(new SummerPromotionStrategy());

            Console.WriteLine($"Discount for order1: {order1.CalculateDiscount()}");
            Console.WriteLine($"Discount for order2: {order2.CalculateDiscount()}");
        }
    }

运行结果:

 

posted on 2023-06-01 17:07  一只向上爬的小蜗牛  阅读(65)  评论(0编辑  收藏  举报