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

在本教程中,我们将学习在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中的策略设计模式相关推荐

  1. Java中的策略设计模式-示例教程

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

  2. java策略设计模式_Java中的策略设计模式

    java策略设计模式 策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设 ...

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

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

  4. Java状态和策略设计模式之间的差异

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

  5. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  6. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  7. Java中的命令设计模式

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

  8. Java中的Memento设计模式-示例教程

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

  9. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

最新文章

  1. Python3 的urllib实例
  2. 【前沿科技】看完这篇文章前,你绝对想象不到欧美航空机器人竟然发展到这个程度了!...
  3. 如何实现字符串的翻转,不用php库函数翻转字符串
  4. 2019值得每天闲逛的网站
  5. 通过JDBC连接取得数据库相关的元数据
  6. php 不识别 函数,奇怪的PHP错误:函数无法识别自己的参数
  7. 值得一用的Windows软件
  8. OpenStack securityGroup rule Set
  9. ioc,di,aop详解
  10. 小程序复制内容至剪贴板
  11. 低功耗微波雷达模块,LED庭院灯智能感应,雷达传感器助力节能减排
  12. java lambda排序
  13. 哲学家名篇粤语诵读文2019年5月1日
  14. Linux:CPU中断绑定----计算 SMP IRQ Affinity
  15. 基于Java和Netty实现的联机版坦克大战游戏
  16. 电子邮件注册网站哪个好:四大邮箱客户端的对比
  17. [SPOJ IGAME Interesting Game]Nim 博弈+数位DP
  18. 基于RTEMS的阿波罗STM32F429开发板(正点原子)适配
  19. 【Java实现学生管理系统】
  20. 网络爬虫获取地铁人流量数据

热门文章

  1. 【二分】最大均值(ybtoj 二分-1-3)
  2. 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)
  3. Tomcat server.xml配置示例
  4. Spring Enable*高级应用及原理
  5. jstack命令:教你如何排查多线程问题
  6. php artisan快捷命令
  7. vue中父组件怎么调用子组件
  8. 使用ueditor实现多图片上传案例——Dao层(IBaseDaoUtil)
  9. JWT(JSON web token)
  10. Struts2下创建自定义类型转换器(表单中日期的处理)