java策略设计模式

策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择。 各种算法选项封装在单独的类中。

在本教程中,我们将学习在Java中实现策略设计模式。

UML表示形式:

首先,我们来看一下策略设计模式的UML表示形式:


在这里,我们有:

  • 策略:定义我们打算执行的常见操作的接口
  • ConcreteStrategy:这些是使用不同算法来执行Strategy界面中定义的操作的实现类
  • 背景:任何需要改变行为并提及策略的事物

JDK中策略模式的一个流行示例是Collections.sort()方法中java.util.Comparator的用法。 我们可以将Collections.sort()方法视为上下文,并将其作为传递对象排序策略的java.util.Comparator实例。

实施策略模式:

众所周知,任何购物网站都提供多种付款方式。 因此,让我们使用此示例来实现策略模式。

我们将首先定义我们的PaymentStrategy接口:

 public interface PaymentStrategy { void pay(Shopper shopper);  } 

现在,让我们定义两种最常见的付款方式,即货到付款和卡付款,作为两种具体的策略类:

 public class CashOnDeliveryStrategy implements PaymentStrategy { @Override public void pay(Shopper shopper) { double amount = shopper.getShoppingCart().getTotal(); System.out.println(shopper.getName() + " selected Cash On Delivery for Rs." + amount ); }  }   public class CardPaymentStrategy implements PaymentStrategy { @Override public void pay(Shopper shopper) { CardDetails cardDetails = shopper.getCardDetails(); double amount = shopper.getShoppingCart().getTotal(); completePayment(cardDetails, amount); System.out.println( "Credit/Debit card Payment of Rs. " + amount + " made by " + shopper.getName()); }  private void completePayment(CardDetails cardDetails, double amount) { ... }  } 

实施上下文:

定义了策略类之后,现在让我们定义一个PaymentContext类:

 public class PaymentContext {  private PaymentStrategy strategy;  public PaymentContext(PaymentStratgey strategy) { this .strategy = strategy; }  public void makePayment(Shopper shopper) { this .strategy.pay(shopper); }  } 

另外,我们的Shopper类看起来类似于:

 public class Shopper {  private String name; private CardDetails cardDetails; private ShoppingCart shoppingCart;  //suitable constructor , getters and setters     public void addItemToCart(Item item) { this .shoppingCart.add(item); }  public void payUsingCOD() { PaymentContext pymtContext = new PaymentContext( new CashOnDeliveryStrategy()); pymtContext.makePayment( this ); }  public void payUsingCard() { PaymentContext pymtContext = new PaymentContext( new CardPaymentStrategy()); pymtContext.makePayment( this ); }  } 

我们系统中的购物者可以使用一种可用的购物策略进行付款。 在我们的示例中,我们的PaymentContext类接受所选的付款策略,然后为该策略调用pay()方法。

策略与状态设计模式:

策略和状态设计模式都是基于接口的模式,可能看起来相似,但有一些重要区别:

  • 状态设计模式定义了各种状态,其中策略模式更多地讨论了不同的算法
  • 在状态模式中,存在从一种状态到另一种状态的过渡。 另一方面,策略模式中的所有策略类别都彼此独立

请随时探索状态设计模式 。

结论:

通过此快速教程,我们现在知道如何实现策略设计模式。

它是最常用的设计模式之一,并遵循“ 打开/关闭”原则 。 因此,要添加新策略,我们可以简单地创建一个额外的策略类。 但是,请注意,我们必须在这里更新客户端代码,因为客户端选择了要调用的策略。

翻译自: https://www.javacodegeeks.com/2019/09/strategy-design-pattern-java.html

java策略设计模式

java策略设计模式_Java中的策略设计模式相关推荐

  1. java命令模式_Java中的命令设计模式

    java命令模式 在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象 ...

  2. java 生成器 设计模式_Java中的生成器设计模式

    java 生成器 设计模式 Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式. 在学习任何设计模式之前,我建议先找出特定设计模式要解 ...

  3. java memento_memento模式_Java中的Memento设计模式-示例教程

    memento模式 记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已 ...

  4. java观察者设计模式_Java中的观察者设计模式

    java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...

  5. java 观察者模式示例_Java中的观察者设计模式-示例教程

    java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...

  6. java 模板方法设计模式_Java中的模板方法设计模式

    java 模板方法设计模式 模板方法是一种行为设计模式 ,用于创建方法存根并将某些实现步骤推迟到子类. 模板方法定义了执行算法的步骤,它可以提供默认实现,该实现对于所有或某些子类可能是通用的. 让我们 ...

  7. java 中策略模式_JAVA中的策略模式

    现在我们有一个虚基类-鸭子(abstract Duck). 有真鸭子,野鸭子,橡皮鸭子继承了该类.虚基类有swing方法,毕竟游泳是所有的鸭子都应有的功能.还有一个虚方法display,这个方法在子类 ...

  8. java 设计模式 示例_Java中的策略设计模式-示例教程

    java 设计模式 示例 策略模式是行为设计模式之一 . 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客 ...

  9. java状态模式和策略模式_Java状态和策略设计模式之间的差异

    java状态模式和策略模式 为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设 ...

最新文章

  1. kettle全量抽数据_漫谈数据平台架构的演化和应用
  2. mysql test 映射到实体_MyBatis实体关系映射
  3. Linux使用lvresize扩展或缩减LV逻辑卷大小
  4. postgresql编译安装
  5. c语言变量定义数组,C语言中数组的定义和使用
  6. 苹果失策?新iPhone捆绑Apple TV+或会致硬件利润率下滑
  7. 微课系列(二):列表方法sort()和内置函数sorted()的稳定排序特点
  8. mysql动态调整jndi_tomcat6.0 JNDI MYSQL设置
  9. 常用WebServices返回数据的4种方法比较 (转)
  10. Unable to install breakpoint in XXX due to missing line number attributes的解决
  11. 7-3 小L的难题 (15 分)
  12. 8路开关量输入8路继电器输出的网络模块
  13. diablo2oo2’s Universal Patcher 中文汉化绿色破解版下载
  14. Cisco 防火墙 SSH配置
  15. SPSS实现线性回归
  16. 异步处理-Promise解决回调地狱
  17. mysql冒号_mysql语句中的冒号是什么意思?
  18. PEP8 Python 编码规范 -----Indent 缩进
  19. 【计算机图形学】基础 - Colorization using Optimization
  20. 房企猪企扎堆转型做光伏,那什么是光伏?

热门文章

  1. K - Let the Flames Begin
  2. P2617 Dynamic Rankings(整体二分)
  3. H.Minimum-cost Flow
  4. [JSOI2007]字符加密
  5. 牛客网 【每日一题】5月13日 加分二叉树
  6. AtCoder4515 [AGC030F] Permutation and Minimum(dp)
  7. 【无码专区1】简单路径的第二大边权(启发式合并+最小生成树)
  8. POJ1821-Fence【单调队列,dp】
  9. 背包例题の01,完全,多重
  10. 洛谷P1462-通往奥格玛瑞的路【日常图论,二分查找,最短路,SPAF】