策略模式
一、定义
定义一系列算法,把他们一个个封装起来,并且使他们可以互相替换。该模式使得算法可以独立于使用它的客户程序而变化。
二、UML类图
-
Context:策略上下文,持有
IStrategy
的引用,负责和具体的策略实现交互; -
IStrategy:策略接口,约束一系列具体的策略算法;
-
ConcreteStrategy:具体的策略实现。
三、优点
- 策略可以互相替换;
- 解决
switch-case
、if-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()}"); } }
运行结果: