• 策略模式适用场景与具体实例解析


    策略模式在多种场合下都能发挥其优势,尤其在需要根据不同条件或策略选择不同算法的场景中。下面是几个具体的适用场景及其对应的实例,以帮助进一步理解策略模式的实际应用。

    1. 支付方式选择

    电子商务网站中,用户可以选择多种支付方式,如信用卡、PayPal、Apple Pay等。每种支付方式的处理流程可能不同,使用策略模式可以将这些支付方式抽象为策略,允许用户在运行时选择最合适的支付方式。

     
    

    Java

    深色版本

    1. 1// 策略接口
    2. 2public interface PaymentStrategy {
    3. 3 void pay(double amount);
    4. 4}
    5. 5
    6. 6// 具体策略:信用卡支付
    7. 7public class CreditCardPayment implements PaymentStrategy {
    8. 8 @Override
    9. 9 public void pay(double amount) {
    10. 10 // 处理信用卡支付逻辑
    11. 11 System.out.println("Paying $" + amount + " with Credit Card");
    12. 12 }
    13. 13}
    14. 14
    15. 15// 具体策略:PayPal支付
    16. 16public class PayPalPayment implements PaymentStrategy {
    17. 17 @Override
    18. 18 public void pay(double amount) {
    19. 19 // 处理PayPal支付逻辑
    20. 20 System.out.println("Paying $" + amount + " with PayPal");
    21. 21 }
    22. 22}
    23. 23
    24. 24// 上下文:购物车
    25. 25public class ShoppingCart {
    26. 26 private PaymentStrategy strategy;
    27. 27
    28. 28 public ShoppingCart(PaymentStrategy strategy) {
    29. 29 this.strategy = strategy;
    30. 30 }
    31. 31
    32. 32 public void checkout(double amount) {
    33. 33 strategy.pay(amount);
    34. 34 }
    35. 35}
    36. 36
    37. 37// 客户端代码
    38. 38public class Client {
    39. 39 public static void main(String[] args) {
    40. 40 ShoppingCart cart = new ShoppingCart(new CreditCardPayment());
    41. 41 cart.checkout(100.0); // 输出:Paying $100.0 with Credit Card
    42. 42
    43. 43 cart = new ShoppingCart(new PayPalPayment());
    44. 44 cart.checkout(200.0); // 输出:Paying $200.0 with PayPal
    45. 45 }
    46. 46}
    2. 排序算法选择

    数据处理中,不同的排序算法适用于不同的数据类型和大小。策略模式可以用来在运行时选择最适合当前数据集的排序算法。

     
    

    Java

    深色版本

    1. 1// 策略接口
    2. 2public interface SortStrategy {
    3. 3 void sort(int[] array);
    4. 4}
    5. 5
    6. 6// 具体策略:冒泡排序
    7. 7public class BubbleSort implements SortStrategy {
    8. 8 @Override
    9. 9 public void sort(int[] array) {
    10. 10 // 实现冒泡排序逻辑
    11. 11 System.out.println("Sorting with Bubble Sort");
    12. 12 }
    13. 13}
    14. 14
    15. 15// 具体策略:快速排序
    16. 16public class QuickSort implements SortStrategy {
    17. 17 @Override
    18. 18 public void sort(int[] array) {
    19. 19 // 实现快速排序逻辑
    20. 20 System.out.println("Sorting with Quick Sort");
    21. 21 }
    22. 22}
    23. 23
    24. 24// 上下文:数据处理器
    25. 25public class DataProcessor {
    26. 26 private SortStrategy strategy;
    27. 27
    28. 28 public DataProcessor(SortStrategy strategy) {
    29. 29 this.strategy = strategy;
    30. 30 }
    31. 31
    32. 32 public void process(int[] array) {
    33. 33 strategy.sort(array);
    34. 34 }
    35. 35}
    36. 36
    37. 37// 客户端代码
    38. 38public class Client {
    39. 39 public static void main(String[] args) {
    40. 40 DataProcessor processor = new DataProcessor(new BubbleSort());
    41. 41 processor.process(new int[]{5, 3, 2, 4, 1}); // 输出:Sorting with Bubble Sort
    42. 42
    43. 43 processor = new DataProcessor(new QuickSort());
    44. 44 processor.process(new int[]{5, 3, 2, 4, 1}); // 输出:Sorting with Quick Sort
    45. 45 }
    46. 46}
    3. 优惠策略选择

    在营销活动中,商家可能提供多种优惠策略,如满减、打折、积分抵扣等。策略模式可以让商家根据商品类别或用户等级选择最优的优惠策略。

     
    

    Java

    深色版本

    1. 1// 策略接口
    2. 2public interface PromotionStrategy {
    3. 3 double applyPromotion(double price);
    4. 4}
    5. 5
    6. 6// 具体策略:满减优惠
    7. 7public class CashBackPromotion implements PromotionStrategy {
    8. 8 private final double threshold;
    9. 9 private final double discount;
    10. 10
    11. 11 public CashBackPromotion(double threshold, double discount) {
    12. 12 this.threshold = threshold;
    13. 13 this.discount = discount;
    14. 14 }
    15. 15
    16. 16 @Override
    17. 17 public double applyPromotion(double price) {
    18. 18 if (price >= threshold) {
    19. 19 return price - discount;
    20. 20 }
    21. 21 return price;
    22. 22 }
    23. 23}
    24. 24
    25. 25// 具体策略:打折优惠
    26. 26public class DiscountPromotion implements PromotionStrategy {
    27. 27 private final double discountRate;
    28. 28
    29. 29 public DiscountPromotion(double discountRate) {
    30. 30 this.discountRate = discountRate;
    31. 31 }
    32. 32
    33. 33 @Override
    34. 34 public double applyPromotion(double price) {
    35. 35 return price * (1 - discountRate);
    36. 36 }
    37. 37}
    38. 38
    39. 39// 上下文:订单处理器
    40. 40public class OrderProcessor {
    41. 41 private PromotionStrategy strategy;
    42. 42
    43. 43 public OrderProcessor(PromotionStrategy strategy) {
    44. 44 this.strategy = strategy;
    45. 45 }
    46. 46
    47. 47 public double processOrder(double price) {
    48. 48 return strategy.applyPromotion(price);
    49. 49 }
    50. 50}
    51. 51
    52. 52// 客户端代码
    53. 53public class Client {
    54. 54 public static void main(String[] args) {
    55. 55 OrderProcessor processor = new OrderProcessor(new CashBackPromotion(100, 20));
    56. 56 System.out.println(processor.processOrder(150)); // 输出:130.0
    57. 57
    58. 58 processor = new OrderProcessor(new DiscountPromotion(0.1));
    59. 59 System.out.println(processor.processOrder(100)); // 输出:90.0
    60. 60 }
    61. 61}
    结论

    策略模式通过将算法封装在独立的策略类中,实现了算法的解耦和动态选择。它提高了代码的灵活性和可维护性,特别是在需要频繁切换或扩展算法的场景中。通过上述实例,我们可以看到策略模式在不同领域中的实际应用,以及它如何简化复杂系统的管理和升级。

  • 相关阅读:
    数据库的新选择 Amazon Aurora
    完美指南|如何使用 ODBC 进行无代理 Oracle 数据库监控?
    划分字母区间【贪心算法】
    JVM堆和方法区是怎样的关系?
    Nginx基础学习
    【PostgreSQL】【存储管理】表和元组的组织方式
    基于Jeecgboot前后端分离的流程管理平台演示系统安装(二)
    Java代理
    这两天搭建环境遇到的几个问题
    Thinkphp使用composer安装扩展包教程
  • 原文地址:https://blog.csdn.net/h356363/article/details/140408049