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

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

策略模式也称为策略模式 。 我们定义了多种算法,并让客户端应用程序将算法用作参数。 此模式的最佳示例之一是采用Comparator参数的Collections.sort()方法。 基于Comparator接口的不同实现,将以不同的方式对对象进行排序,请查看此文章以使用Java Comparable和Comparator在Java中对对象进行排序。

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

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

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

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

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");}}
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.");}}

现在我们的算法已经准备就绪,我们可以实现购物车,并且付款方式将需要输入作为付款策略。

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;}}
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);}
}

请注意,购物车的付款方式需要付款算法作为参数,而不是将其存储为实例变量。

让我们用一个简单的程序测试我们的设置。

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()方法中也遵循相同的方法,将比较器用作论点。
  • 策略模式与状态模式非常相似。 区别之一是Context包含状态作为实例变量,并且可以有多个任务的实现可以依赖于状态,而在策略模式中,strategy作为参数传递给方法,并且上下文对象没有任何变量来存储它。
  • 当我们有多个用于特定任务的算法并且希望我们的应用程序灵活地在运行时为特定任务选择任何算法时,策略模式很有用。

这就是Java中的Strategy Pattern的全部内容,希望您喜欢它。

参考: Java中的策略设计模式 -JCG合作伙伴 Pankaj Kumar在开发人员食谱博客上的示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/strategy-design-pattern-in-java-example-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-cli 3.0 使用全过程讲解

2018年8月13日更新&#xff1a; 恭祝vue-cli 3.0.0 官方正式版发布&#xff0c;此后我们可以正式在3.0环境下进行项目开发了。 此文发布以来受到了很多朋友的阅读&#xff0c;但我深知这篇文章还是很浅显的&#xff0c;因此&#xff0c;我会在后续的 3.0 使用过程中分享我遇到…

前端入行两年--教会了我这些道理

1.前言 光阴似箭&#xff0c;日月如梭。不得不感慨时间过得很快&#xff0c;2017差不多结束了&#xff0c;一下子我从事前端开发的时间已经两年了。这两年可以说是一波三折&#xff0c;回想这两年的经历&#xff0c;让我忍不住了写下了这篇文章&#xff0c;记录自己在这两年经历…

巴霍巴利王

巴霍巴利王 惊心动魄的宫廷政变&#xff0c;必然铸就新的王朝更迭。时代的婉转&#xff0c;终究选上得民心的君主。我们的故事就这样悄无声息的将你带入幽深的宫廷内院。 夜幕之中&#xff0c;面对寒冷与杀戮&#xff0c;一位身负重伤王室女人&#xff0c;抱着一个新生儿&#…

Java中的观察者设计模式-示例教程

观察者模式是行为设计模式之一 。 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时&#xff0c;观察者设计模式很有用。 在观察者模式中&#xff0c;监视另一个对象状态的对象称为Observer &#xff0c;而正在监视的对象称为Subject 。 根据GoF&#xff0c;观察者模式…

IdnentiyServer-使用客户端凭据访问API

情景如下&#xff1a;一个客户端要访问一个api&#xff0c;不需要用户登录&#xff0c;但是又不想直接暴露api给外部使用&#xff0c;这时可以使用identityserver添加访问权限。 客户端通过clientid和secrect访问identitserver的Token Endpoint,获取accesstoken&#xff1b; 接…

重要·Flutter 首个预览版 发布

今天&#xff0c;InfoQ China 主办的 GMTC 全球大前端技术大会在北京举行&#xff0c;在这次大会中 Google 宣布发布 Flutter 首个预览版。这无疑让 Flutter 迈上了一个新的台阶。于此同时推出了 Flutter 社区中文资源 。可能有些同学还不了解 Flutter&#xff0c;这里再普及一…

复习做UWP时涉及到的几种加密签名相关

复习做UWP时涉及到的几种加密签名相关 原文:复习做UWP时涉及到的几种加密签名相关本人菜鸟一枚&#xff0c;大学里凭兴趣学了一点WP的皮毛&#xff0c;后来又幸运&#xff08;或者不幸&#xff09;的进了一家专注于Windows生态的公司做了一段时间的UWP。在博客园写点自己遇到的…

Java中的中介器设计模式-示例教程

中介者模式是行为设计模式之一 &#xff0c;因此它处理对象的行为。 中介器设计模式用于在系统中不同对象之间提供集中式通信介质。 根据GoF&#xff0c;中介者模式意图是&#xff1a; 通过封装不同对象集相互交互和通信的方式&#xff0c;允许松散耦合。 允许每个对象集的动作…

java gc full gc_Java中full gc什么意思?

慕雪6442864除直接调用System.gc外&#xff0c;触发Full GC执行的情况有如下四种。1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象&#xff0c;当执行Full GC后空间仍然不足&#xff0c;则抛出如下错误&#xff1a;java.lang.Out…

axios请求超时,设置重新请求的完美解决方法

自从使用Vue2之后&#xff0c;就使用官方推荐的axios的插件来调用API&#xff0c;在使用过程中&#xff0c;如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历。 具体原因 最近公司在做一个项目, 服务端数据接口用的是Php输出的API, 有时候在…

从代码内部:骆驼路由引擎第一部分

因此&#xff0c;最近我重新燃起了对Apache Camel工作原理的兴趣。 Camel是一种功能强大的集成工具&#xff0c;用途非常广泛&#xff0c;但是只要我投入使用&#xff0c;我都会忍不住想&#xff1a;“嗯&#xff0c;这到底是怎么做到的&#xff01;” …猜想我只是有一个诀窍&…

各种推导式合集

推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式。但是除此之外&#xff0c;其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式&#xff0c;同样适用于其他推导式。 variable [out_exp_res for out_exp in input_list if o…

适用于高级Java开发人员的十大书籍

Java是当今最流行的编程语言之一。 有很多适合初学者的书籍。 但是对于那些使用Java进行过一段时间编程的人来说&#xff0c;其中有些人看起来有些简单和多余。 初学者的书没有带来新鲜有趣的想法。 但是&#xff0c;高级Java书籍并不总是一应俱全&#xff0c;部分原因是因为它…

Leetcode 456. 132 Pattern

题目的意思就是给你一个数组 里面一堆数&#xff0c;你是否能找到这样三个数&#xff0c;第一个数比第三个数小&#xff0c;第二个数最大。比如 1, 3, 2 或者 4, 9, 5 这种&#xff0c;数字可以不连续在一起&#xff0c;但是要保证顺序不变&#xff0c;只要有这么一组数就可以…

「起点订阅页」Checkbox 美化引发的蝴蝶效应

本文作者&#xff1a;任家乐 原创声明&#xff1a;本文为阅文前端团队 YFE 成员出品&#xff0c;请尊重原创&#xff0c;转载请联系公众号 (id: yuewen_YFE) 获取授权&#xff0c;并注明作者、出处和链接。 性能风暴 「据说亚马逊雨林的一只蝴蝶偶尔扇动几下翅膀&#xff0c;可…

python polar函数_Python可视化很简单,可是你会吗?python绘制饼图、极线图和气泡图,让我来教教你吧,一文教会!!!...

matplotlib库作为Python数据化可视化的最经典和最常用库&#xff0c;掌握了它就相当于学会了Python的数据化可视化&#xff0c;今天呢&#xff0c;咱们就一起来聊聊关于Python如何去绘制饼图、极线图和气泡图吧好啦&#xff0c;废话少说&#xff0c;咱们就开始吧&#xff01;用…

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

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

函数递归与二分法

1.什么是函数递归 函数的递归调用是函数嵌套调用的一种特殊形式&#xff0c; 特殊在调用一个函数的过程中又直接或者间接地调用了该函数本身 递归本质就是一个循环的过程&#xff0c; 但是递归必须满足两个原则&#xff1a; 1.每进入下一层递归&#xff0c;问题的规模必须有所减…

使用Oracle WebLogic创建部署计划

创建部署计划 部署计划是JSR-88部署标准的一部分&#xff0c;尽管在该标准中未明确说明。 部署计划是一个XML文档&#xff0c;用于定义自定义WebLogic Server部署环境。 此配置可用于覆盖在应用程序归档文件中定义的特定设置。 有许多原因可能导致您不希望修改应用程序存档的原…

记录一个前端架构的想法

前端&#xff0c;真的是让我哭笑不得的职业&#xff0c;从几年前作为打酱油的理想职业到现在的热门职业&#xff0c;无疑在这个过程中&#xff0c;门槛变高了&#xff0c;而且还是非常高。一大堆的框架和库&#xff0c;像什么vue啦、react啦、angular啦、webpack啦等等等等。让…