ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【软件设计】常用设计模式--策略模式 [打印本页]

作者: 曂沅仴駦    时间: 2024-9-7 04:48
标题: 【软件设计】常用设计模式--策略模式
策略模式(Strategy Pattern)

1. 概念

策略模式是一种行为型设计模式,它界说了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式让算法独立于使用它的客户而变化。
通过策略模式,我们可以将差别的算法封装到独立的类中,并通过客户端在运行时选择具体的策略类。这种模式的长处是进步了代码的灵活性和可扩展性。
2. 模式结构

策略模式通常包含以下几个构成部分:

3. UML 类图

  1. +------------------+           +----------------+
  2. |   Context        |           |   Strategy      |
  3. |------------------|           |----------------|
  4. | - strategy: IStrategy |<------| + Algorithm()  |
  5. | + SetStrategy()  |           +----------------+
  6. | + ExecuteAlgorithm() |               /\
  7. +------------------+                  /  \
  8.                                      /    \
  9.                       +----------------+ +----------------+
  10.                       |   StrategyA    | |   StrategyB    |
  11.                       +----------------+ +----------------+
  12.                       | + Algorithm()  | | + Algorithm()  |
  13.                       +----------------+ +----------------+
复制代码
4. 实现方式

C# 示例

步骤1:界说策略接口

  1. public interface IStrategy
  2. {
  3.     void Algorithm();
  4. }
复制代码
步骤2:实现具体策略类

  1. public class ConcreteStrategyA : IStrategy
  2. {
  3.     public void Algorithm()
  4.     {
  5.         Console.WriteLine("Using Strategy A.");
  6.     }
  7. }
  8. public class ConcreteStrategyB : IStrategy
  9. {
  10.     public void Algorithm()
  11.     {
  12.         Console.WriteLine("Using Strategy B.");
  13.     }
  14. }
复制代码
步骤3:实现上下文类

  1. public class Context
  2. {
  3.     private IStrategy _strategy;
  4.     public void SetStrategy(IStrategy strategy)
  5.     {
  6.         _strategy = strategy;
  7.     }
  8.     public void ExecuteAlgorithm()
  9.     {
  10.         _strategy?.Algorithm();
  11.     }
  12. }
复制代码
步骤4:使用策略模式

  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         Context context = new Context();
  6.         context.SetStrategy(new ConcreteStrategyA());
  7.         context.ExecuteAlgorithm(); // Output: Using Strategy A.
  8.         context.SetStrategy(new ConcreteStrategyB());
  9.         context.ExecuteAlgorithm(); // Output: Using Strategy B.
  10.     }
  11. }
复制代码
Java 示例

步骤1:界说策略接口

  1. public interface Strategy {
  2.     void algorithm();
  3. }
复制代码
步骤2:实现具体策略类

  1. public class ConcreteStrategyA implements Strategy {
  2.     @Override
  3.     public void algorithm() {
  4.         System.out.println("Using Strategy A.");
  5.     }
  6. }
  7. public class ConcreteStrategyB implements Strategy {
  8.     @Override
  9.     public void algorithm() {
  10.         System.out.println("Using Strategy B.");
  11.     }
  12. }
复制代码
步骤3:实现上下文类

  1. public class Context {
  2.     private Strategy strategy;
  3.     public void setStrategy(Strategy strategy) {
  4.         this.strategy = strategy;
  5.     }
  6.     public void executeAlgorithm() {
  7.         strategy.algorithm();
  8.     }
  9. }
复制代码
步骤4:使用策略模式

  1. public class Main {
  2.     public static void main(String[] args) {
  3.         Context context = new Context();
  4.         context.setStrategy(new ConcreteStrategyA());
  5.         context.executeAlgorithm(); // Output: Using Strategy A.
  6.         context.setStrategy(new ConcreteStrategyB());
  7.         context.executeAlgorithm(); // Output: Using Strategy B.
  8.     }
  9. }
复制代码
5. 长处


6. 缺点


7. 应用场景


8. 与其他模式的比较


小结

策略模式非常实用于必要根据差别条件动态选择算法或行为的场景。通过封装差别的策略实现,客户端代码可以更加简洁和灵活。
策略模式变体和实际应用场景

1. 变体

策略模式的基本头脑虽然简单,但在实际使用中可以根据具体需求进行扩展和变体。以下是几种常见的变体:
变体1: 组合模式与策略模式结合

策略模式通常用于更换算法,而组合模式用于构建条理结构的复杂对象。将这两者结合,可以让策略模式的差别策略实现与组合对象配合,实现更加灵活的行为变化。
示例

如果我们有一个文件压缩系统,使用组合模式来管理文件夹和文件,同时使用策略模式来界说差别的压缩算法(如 ZIP、RAR、7z 等)。每种压缩策略独立实现,文件夹中的文件可以动态选择压缩策略。
变体2: 动态策略切换

通常,策略模式中策略的切换是由客户端代码来决定的。但在某些情况下,策略可以根据系统状态或外部条件自动切换。比如在某些实时系统中,可以根据负载条件动态切换算法。
示例

在网络哀求中,可以根据网络耽误自动切换差别的策略,比方切换超时重试策略或者差别的缓存策略,以包管系统的稳定性和性能。
变体3: 缓存策略实例

为了进步性能,我们可以将策略对象缓存起来,而不是每次都重新创建策略实例。比如在大量重复调用的情况下,可以镌汰不必要的对象创建和烧毁。
示例

在一个大规模应用步伐中,差别的日记策略(如文件日记、数据库日记等)可以通过缓存实现。每次切换策略时,优先从缓存中获取,而不是每次都重新实例化。
变体4: 策略模式与模板方法模式结合

策略模式和模板方法模式可以结合使用。模板方法界说了算法的基本框架,但将具体步骤的实现耽误到策略类中。如许可以通过差别的策略类来实现框架的细化。
示例

在数据处置处罚系统中,我们可以界说一个模板方法,处置处罚步骤包括数据加载、处置处罚和保存。
差别的策略类可以实现特定的数据处置处罚方法,如文本处置处罚、图像处置处罚等。
2. 实际应用场景

场景1: 差别扣头策略的实现

电子商务平台通常会提供差别的扣头方式,比方满减、打折、会员优惠等。这些差别的扣头方式可以通过策略模式来实现,客户可以动态选择差别的扣头策略。
C#示例

  1. public interface IDiscountStrategy
  2. {
  3.     decimal ApplyDiscount(decimal totalPrice);
  4. }
  5. public class PercentageDiscount : IDiscountStrategy
  6. {
  7.     private decimal _percentage;
  8.     public PercentageDiscount(decimal percentage)
  9.     {
  10.         _percentage = percentage;
  11.     }
  12.     public decimal ApplyDiscount(decimal totalPrice)
  13.     {
  14.         return totalPrice - (totalPrice * _percentage / 100);
  15.     }
  16. }
  17. public class FlatRateDiscount : IDiscountStrategy
  18. {
  19.     private decimal _flatRate;
  20.     public FlatRateDiscount(decimal flatRate)
  21.     {
  22.         _flatRate = flatRate;
  23.     }
  24.     public decimal ApplyDiscount(decimal totalPrice)
  25.     {
  26.         return totalPrice - _flatRate;
  27.     }
  28. }
  29. public class Context
  30. {
  31.     private IDiscountStrategy _strategy;
  32.     public void SetDiscountStrategy(IDiscountStrategy strategy)
  33.     {
  34.         _strategy = strategy;
  35.     }
  36.     public decimal GetDiscountedPrice(decimal totalPrice)
  37.     {
  38.         return _strategy.ApplyDiscount(totalPrice);
  39.     }
  40. }
复制代码
客户可以根据差别的促销运动选择合适的扣头策略:
  1. var context = new Context();
  2. context.SetDiscountStrategy(new PercentageDiscount(10));
  3. Console.WriteLine(context.GetDiscountedPrice(100)); // 打九折
  4. context.SetDiscountStrategy(new FlatRateDiscount(20));
  5. Console.WriteLine(context.GetDiscountedPrice(100)); // 减去20元
复制代码
场景2: 动态路由选择

在网络通信或导航系统中,路由算法可能会根据差别的需求动态调解。
比方,有时必要使用最短路径算法,有时必要使用最安全路径算法。策略模式可以用于封装这些差别的路径规划算法。
场景3: 图像渲染策略

在图像处置处罚系统中,可以根据图像的质量或表现装备的性能来动态选择渲染算法。
对于高性能装备,可以选择复杂的高质量渲染算法;对于低性能装备,可以选择简单的低质量渲染策略。
场景4: 动态加密算法选择

在安全系统中,可以根据数据的敏感性或系统资源选择差别的加密算法。
某些场景下,可能必要使用快速但安全性较低的加密算法;而在更敏感的数据场景下,则使用更强的加密策略。
场景5: 数据导入导出

在企业软件中,数据导入导出功能可能支持多种格式(如CSV、XML、JSON等)。
可以使用策略模式封装每种格式的处置处罚逻辑,用户可以根据需求选择差别的导入导出策略。
小结

策略模式的变体和实际应用展示了它的灵活性和扩展性。在复杂的系统中,策略模式可以资助我们应对多变的需求,并为系统的可维护性提供保障。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4