行为设计模式 - 策略设计模式

策略设计模式是行为设计模式之一。当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现。

策略设计模式

策略模式也称为战略模式。我们定义了多个算法,让客户端应用程序通过算法将其用作参数。

策略模式的最佳示例之一是Collections.sort()采用Comparator参数的方法。基于Comparator接口的不同实现,对象将以不同的方式进行排序。

对于我们的示例,我们将尝试实施一个简单的购物车,我们有两种付款策略 - 使用信用卡或使用PayPal。

首先,我们将为我们的策略模式示例创建接口,在我们的例子中,支付作为参数传递的金额。

PaymentStrategy.java


package com.journaldev.design.strategy;public interface PaymentStrategy {public void pay(int amount);
}

现在我们将不得不使用信用卡/借记卡或通过PayPal为支付创建具体的算法实现。

CreditCardStrategy.java


package com.journaldev.design.strategy;public class CreditCardStrategy implements PaymentStrategy {private String name;private String cardNumber;private String cvv;private String dateOfExpiry;public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){this.name=nm;this.cardNumber=ccNum;this.cvv=cvv;this.dateOfExpiry=expiryDate;}@Overridepublic void pay(int amount) {System.out.println(amount +" paid with credit/debit card");}}

PaypalStrategy.java


package com.journaldev.design.strategy;public class PaypalStrategy implements PaymentStrategy {private String emailId;private String password;public PaypalStrategy(String email, String pwd){this.emailId=email;this.password=pwd;}@Overridepublic void pay(int amount) {System.out.println(amount + " paid using Paypal.");}}

现在我们的战略模式示例算法准备好了。我们可以实施购物车和付款方式将需要输入作为付款策略。

Item.java


package com.journaldev.design.strategy;public class Item {private String upcCode;private int price;public Item(String upc, int cost){this.upcCode=upc;this.price=cost;}public String getUpcCode() {return upcCode;}public int getPrice() {return price;}}

ShoppingCart.java


package com.journaldev.design.strategy;import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;public class ShoppingCart {//List of itemsList<Item> items;public ShoppingCart(){this.items=new ArrayList<Item>();}public void addItem(Item item){this.items.add(item);}public void removeItem(Item item){this.items.remove(item);}public int calculateTotal(){int sum = 0;for(Item item : items){sum += item.getPrice();}return sum;}public void pay(PaymentStrategy paymentMethod){int amount = calculateTotal();paymentMethod.pay(amount);}
}

请注意,购物车的付款方式需要付款算法作为参数,并且不会将其作为实例变量存储在任何位置。

让我们用一个简单的程序测试我们的策略模式示例设置。

ShoppingCartTest.java


package com.journaldev.design.strategy;public class ShoppingCartTest {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();Item item1 = new Item("1234",10);Item item2 = new Item("5678",40);cart.addItem(item1);cart.addItem(item2);//pay by paypalcart.pay(new PaypalStrategy("myemail@example.com", "mypwd"));//pay by credit cardcart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));}}

上述计划的输出是:


50 paid using Paypal.
50 paid with credit/debit card

战略设计模式类图

战略设计模式重点

  • 我们可以使用组合为策略创建实例变量,但我们应该避免这种情况,因为我们希望将特定策略应用于特定任务。在Collections.sort()和Arrays.sort()方法中遵循相同的方法,将比较器作为参数。
  • 策略模式与State Pattern非常相似。其中一个区别是Context包含状态作为实例变量,并且可以有多个任务,其实现可以依赖于状态,而策略模式策略作为参数传递给方法,上下文对象没有任何变量来存储它。
  • 当我们为特定任务提供多个算法时,策略模式很有用,我们希望我们的应用程序可以灵活地在运行时为特定任务选择任何算法。

这就是java中的Strategy Pattern,我希望你喜欢它。

转载来源:https://www.journaldev.com/1754/strategy-design-pattern-in-java-example-tutorial

行为设计模式 - 策略设计模式相关推荐

  1. Head First 设计模式 —— 策略设计模式

    创建一个能够根据所传递的参数对象的不同而具有不同行为(动态绑定的多态机制)的方法,被称为策略设计模式.

  2. 创建型设计模式:模板设计模式/观察者设计模式/策略设计模式

    目录 设计模式的设计原则 模板设计模式 观察者模式 策略设计模式 设计模式的设计原则 依赖倒置:高层模块不应该依赖低层模块,两者都应该依赖抽象: 抽象不应该依赖具体实现,具体实现应该依赖于抽象: (记 ...

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

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

  4. 单例模式访问mysql设计类图_如何应用策略设计模式分离JDBC数据库连接中的外部环境信息...

    软件项目实训及课程设计指导--如何应用策略设计模式分离JDBC数据库连接中的外部环境信息 1.什么是策略(Strategy)设计模式 策略设计模式把"算法"(也就是软件应用系统中的 ...

  5. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  6. java中策略设计模式_Java中的设计模式(五):策略模式

    策略设计模式是行为设计模式之一.当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现. 策略模式的最佳示例之一是Collections.sort()采用Comparator参 ...

  7. Java设计模式之策略设计模式

    1.什么是-策略设计模式 在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Ha ...

  8. 策略模式示例代码_策略设计模式示例

    策略模式示例代码 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的 ...

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

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

最新文章

  1. jquery.dragsort.js 实现拖拽过程遇到的问题
  2. 区块链应用落地的6大挑战
  3. Effective Java 电子书 apk版本下载
  4. 30 个很棒的 PHP 开源 CMS 内容管理系统
  5. HTML+CSS+JS面试题(附带答案)
  6. DataTable实现分组
  7. linux新增动态库后可执行程序找不到的问题
  8. Reflector 3在录制中如何添加自己的声音
  9. H264编码质量屏幕截图
  10. 史上最全科研网站!!!
  11. android shn1 获取_华为光猫获得Root Shell(shell的root权限)详细说明,接力sdgaojian发帖。...
  12. 史上最给力客厅风水 让你躲过血光之灾
  13. Java多线程---Phaser
  14. 微信扫码充值 php,微信扫码支付,php版
  15. 阿里的Maven仓库地址
  16. 镜像电流源特点_镜像电流源原理及其应用电路.pdf
  17. tomcat8.5集群修改端口,发生临时 dns 错误,请尝试刷新页面
  18. 8086微处理器结构
  19. 传统服装行业软件的销售体系分析
  20. 从头开始学习 Dojo,第 2 部分: 使用 Dojo 掌握面向对象开发

热门文章

  1. 一些不起眼但非常有用的 Vim 命令
  2. html5游戏制作入门系列教程(六)
  3. magento:getChildHtml() 与getChildChildHtml() 的用法,区别
  4. MouseOut与RollOut,MouseOver与RollOver
  5. Tensorflow学习——导入数据
  6. SpringBoot—jasypt加解密库的使用方法
  7. 数组算法 中部删除数据 1202
  8. linux-数据库篇-索引
  9. Elasticsearch 模糊搜索
  10. linux /etc/passwd文件各参数的意义