策略模式

打印 上一主题 下一主题

主题 1006|帖子 1006|积分 3018

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在软件开辟的世界里,我们经常会遇到这样的场景:一个对象必要根据不同的情况采取不同的算法或行为。比方,在一个电商体系中,计算商品折扣时,针对不同的用户品级(平凡用户、会员用户、高级会员用户等)可能有不同的折扣策略。传统的办理方式可能是在一个方法中通过大量的条件判定语句(如 if - else 或 switch - case)来实现不同的行为逻辑,但这种方式会使代码变得痴肥、难以维护,并且倒霉于扩展新的行为。策略模式(Strategy Pattern)为这类问题提供了一种优雅的办理方案,它将不同的算法或行为封装成独立的策略类,使得对象可以在运行时根据必要灵活地选择不同的策略。

策略模式概述

策略模式是一种行为型筹划模式,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以互相替换。策略模式主要包含以下几个角色:

  • 环境类(Context):持有一个策略接口的引用,提供一个方法来设置具体的策略对象,并在必要时调用策略对象的方法。
  • 抽象策略类(Strategy):定义一个接口,用于封装具体的算法或行为。
  • 具体策略类(ConcreteStrategy):实现抽象策略类定义的接口,提供具体的算法或行为实现。

策略模式代码示例

以下是利用 Java 语言实现策略模式的示例代码。以一个简单的付出体系为例,体系支持多种付出方式(如付出宝付出、微信付出、银行卡付出),每种付出方式有不同的付出逻辑。
  1. // 抽象策略类:支付策略
  2. interface PaymentStrategy {
  3.     void pay(double amount);
  4. }
  5. // 具体策略类:支付宝支付
  6. class AlipayStrategy implements PaymentStrategy {
  7.     @Override
  8.     public void pay(double amount) {
  9.         System.out.println("使用支付宝支付金额:" + amount);
  10.     }
  11. }
  12. // 具体策略类:微信支付
  13. class WeChatPayStrategy implements PaymentStrategy {
  14.     @Override
  15.     public void pay(double amount) {
  16.         System.out.println("使用微信支付金额:" + amount);
  17.     }
  18. }
  19. // 具体策略类:银行卡支付
  20. class BankCardPayStrategy implements PaymentStrategy {
  21.     @Override
  22.     public void pay(double amount) {
  23.         System.out.println("使用银行卡支付金额:" + amount);
  24.     }
  25. }
  26. // 环境类:支付上下文
  27. class PaymentContext {
  28.     private PaymentStrategy paymentStrategy;
  29.     public PaymentContext(PaymentStrategy paymentStrategy) {
  30.         this.paymentStrategy = paymentStrategy;
  31.     }
  32.     public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
  33.         this.paymentStrategy = paymentStrategy;
  34.     }
  35.     public void executePayment(double amount) {
  36.         paymentStrategy.pay(amount);
  37.     }
  38. }
  39. public class StrategyPatternDemo {
  40.     public static void main(String[] args) {
  41.         // 使用支付宝支付
  42.         PaymentContext paymentContext = new PaymentContext(new AlipayStrategy());
  43.         paymentContext.executePayment(100.0);
  44.         // 切换为微信支付
  45.         paymentContext.setPaymentStrategy(new WeChatPayStrategy());
  46.         paymentContext.executePayment(200.0);
  47.         // 切换为银行卡支付
  48.         paymentContext.setPaymentStrategy(new BankCardPayStrategy());
  49.         paymentContext.executePayment(300.0);
  50.     }
  51. }
复制代码
在上述代码中,PaymentStrategy 是抽象策略类,定义了付出的接口 pay。AlipayStrategy、WeChatPayStrategy 和 BankCardPayStrategy 是具体策略类,分别实现了不同付出方式的付出逻辑。PaymentContext 是环境类,持有一个 PaymentStrategy 的引用,通过 executePayment 方法调用具体策略类的 pay 方法来实验付出操纵。在 main 方法中,我们创建了 PaymentContext 对象,并通过设置不同的付出策略,演示了在运行时动态切换付出方式的过程。

策略模式的应用场景


  • 算法选择:当一个体系必要根据不同的条件选择不同的算法时,策略模式非常实用。比方,在排序算法中,根据数据规模和特点选择不同的排序策略(冒泡排序、快速排序、归并排序等)。
  • 行为变化:在游戏开辟中,角色可能有不同的行为模式(如攻击方式、移动方式等),可以利用策略模式将这些行为封装成不同的策略类,根据游戏场景或角色状态动态切换行为。
  • 业务规则变化:在电商体系中,除了付出策略,不同的促销活动(满减、折扣、赠品等)也可以看作是不同的策略,根据不同的业务规则和时间动态应用不同的促销策略。

策略模式的优缺点


  • 优点

    • 灵活性高:策略模式允许在运行时动态地切换算法或行为,使得体系更加灵活,能够快速适应业务需求的变化。比方,在付出体系中,用户可以根据自己的喜好随时切换付出方式。
    • 可维护性好:将不同的算法或行为封装在独立的策略类中,每个策略类只负责自己的逻辑,符合单一职责原则。这使得代码结构更加清楚,易于理解和维护。假如必要修改或扩展某种算法,只必要在对应的策略类中进行操纵,不会影响其他策略类。
    • 扩展性强:当必要添加新的算法或行为时,只必要创建一个新的具体策略类并实现抽象策略接口,然后在环境类中就可以利用这个新的策略,符合开闭原则。比方,在付出体系中添加新的付出方式(如 Apple Pay),只必要创建相应的策略类并进行简单配置即可。

  • 缺点

    • 客户端必要相识策略:客户端必要知道有哪些具体的策略可供选择,并负责选择符合的策略。这可能会增加客户端的复杂性,尤其是当策略种类较多时,客户端必要耗费更多的精力来选择符合的策略。
    • 策略类数量增加:每增加一种新的算法或行为,就必要创建一个新的策略类,这可能导致策略类的数量增多,使项目的代码结构变得复杂。在管理和维护这些策略类时,必要耗费更多的精力。
    • 性能开销:由于策略模式通过对象组合的方式来实现算法的切换,会产生一定的对象创建和方法调用开销。在性能敏感的场景下,可能必要考虑这种开销对体系性能的影响。


结语

盼望本文能资助您更好地理解策略模式的概念及实在际应用。假如您有任何疑问或发起,请随时留言交换。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表