策略模式应用场景和uml_策略模式

策略模式应用场景和uml

在最近的博客中,我收到了Wojciech Soczy?ski的评论,内容涉及在使用“不要问”(TDA)时如何使用“战略”模式实施单一责任原则(SRP)。 在某些时候,我打算进一步讨论这个问题,但首先想到的,这将是一个好主意,用我的购物例子,我用了几个星期前在我的定义策略模式泰尔不问及其后续行动拆卸泰尔不要问博客:

首先定义:用最简单的术语,您可以将策略模式定义为告诉对象执行一项工作,并使用ANOTHER对象来执行它。

为了进一步阐明这一点,我将通过给它一个pay()*方法来稍微重新设计ShoppingCart:

public class ShoppingCart {private final List<Item> items;public ShoppingCart() {items = new ArrayList<Item>();}public void addItem(Item item) {items.add(item);}public double calcTotalCost() {double total = 0.0;for (Item item : items) {total += item.getPrice();}return total;}public boolean pay(PaymentMethod method) {double totalCost = calcTotalCost();return method.pay(totalCost);}
}

关于pay()方法要注意的是,它采用了类型PaymentMethod的一个参数–在我上面的定义中,PaymentMethod是“ ANOTHER”对象。

接下来要做的是将PaymentMethod定义为接口。 为什么要使用界面? 这是因为该技术的强大之处在于您可以在运行时决定将哪种具体类型传递给ShoppingCart进行付款。 例如,给定“付款”界面:

public interface PaymentMethod {public boolean pay(double amount);}

然后,您可以定义任何具体的付款对象,例如Visa或MasterCard,例如:

public class Visa implements PaymentMethod {private final String name;private final String cardNumber;private final Date expires;public Visa(String name, String cardNumber, Date expires) {super();this.name = name;this.cardNumber = cardNumber;this.expires = expires;}@Overridepublic boolean pay(double amount) {// Open Comms to Visa// Verify connection// Paybill using these detailsreturn true; // if payment goes through}}

…和

public class MasterCard implements PaymentMethod {private final String name;private final String cardNumber;private final Date expires;public MasterCard(String name, String cardNumber, Date expires) {super();this.name = name;this.cardNumber = cardNumber;this.expires = expires;}@Overridepublic boolean pay(double amount) {// Open Comms to Mastercard// Verify connection// Paybill using these detailsreturn true; // if payment goes through}}

最后要做的就是通过单元测试来证明这一点:payBillUsingVisa

@Testpublic void payBillUsingVisa() {ShoppingCart instance = new ShoppingCart();Item a = new Item("gloves", 23.43);instance.addItem(a);Item b = new Item("hat", 10.99);instance.addItem(b);Date expiryDate = getCardExpireyDate();PaymentMethod visa = new Visa("CaptainDebug", "1234234534564567", expiryDate);boolean result = instance.pay(visa);assertTrue(result);}private Date getCardExpireyDate() {Calendar cal = Calendar.getInstance();cal.clear();cal.set(2015, Calendar.JANUARY, 21);return cal.getTime();}

在上面的代码中,您可以看到我正在创建一个ShoppingCart,然后添加了一些商品。 最后,我以Visa对象的形式创建了一个新的PaymentMethod,并将其注入到pay(PaymentMethod method)函数中,这是问题的症结所在。 在另一种情况下,我可以轻松创建一个MasterCard对象并将其用作Visa的直接替代品-即作为参数传递的对象是在运行时确定的。

这就定义了战略模式,但这还不是博客的结尾。 如果您曾经使用过Spring,但从未听说过Strategy模式,那么您应该对这一切感到有些熟悉。 这是因为事实证明,Spring的家伙使用策略模式来支撑他们的整个技术。 如果以上面的示例为例,并进行一些细微更改,我可以得出:

@Component
public class SpringShoppingCart {private final List<Item> items;@Autowired@Qualifier("Visa")private PaymentMethod method;public SpringShoppingCart() {items = new ArrayList<Item>();}public void addItem(Item item) {items.add(item);}public double calcTotalCost() {double total = 0.0;for (Item item : items) {total += item.getPrice();}return total;}public boolean pay() {double totalCost = calcTotalCost();return method.pay(totalCost);}
}

这种化身与第一个化身之间的唯一区别是,使用@Autowired注释加载策略类Visa时,Spring会注入该策略类。 综上所述,我猜想这意味着策略模式是世界上最受欢迎的模式。

*出于讨论的目的,我假设ShoppingCart可以自己付费,但是这是否正确,是一个全新的博客……

参考: Captain Debug博客博客中来自JCG合作伙伴 Roger Hughes的《策略模式》 。


翻译自: https://www.javacodegeeks.com/2012/04/strategy-pattern.html

策略模式应用场景和uml

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

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

相关文章

mysql建表时主键_mysql建表时怎么设置主键?

设置方法&#xff1a;在“CREATE TABLE”语句中&#xff0c;通过“PRIMARY KEY”关键字来指定主键&#xff0c;语法格式“字段名 数据类型 PRIMARY KEY [默认值]”或“[CONSTRAINT 约束名] PRIMARY KEY 字段名”。主键(PRIMARY KEY)的完整称呼是“主键约束”&#xff0c;是 MyS…

在OpenShift上部署Java EE微服务

我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客。 您学习了如何使用Maven构建一个所谓的“胖子”&#xff0c;还使用Maven Docker插件对我们的微服务进行了Docker化并在Docker Machine上本地运行。 这是在本地测试事物的好方法。 到目前为止&#xff0c;缺少的…

rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读

推荐阅读一下下2020年后想跳槽&#xff1f;MQ、ZK、Nginx、Kafk等分布式技术你都掌握了&#xff1f;阿里架构师推荐学习的《RabbitMQ实战指南》&#xff0c;渣渣的你都看过吗&#xff1f;RocketMQ入门手册RocketMQ是一个分布式、队列模型的开源消息中间件&#xff0c;前身是Met…

.net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...

一、理解asp.net绑定数据库终于学习到了连接数据库部分的内容&#xff0c;杨中科老师视频看起来挺轻松的&#xff0c;如果是高清版就更ok了。我发现我学习新的编程语言会有一个特点&#xff0c;都想要赶紧学习数据库&#xff0c;数据就是一切&#xff0c;有了数据才能操作一切的…

jetty代理jetty_如何在Jetty中使用SPDY

jetty代理jettySPDY是Google提出的一种新协议&#xff0c;是针对网络的新协议。 SPDY与HTTP兼容&#xff0c;但尝试通过压缩&#xff0c;多路复用和优先级降低网页负载。准确地说&#xff0c;快速的目标是&#xff1a;&#xff08; http://dev.chromium.org/spdy/spdy-whitepap…

将Java EE与jOOQ结合使用的初学者指南

Java EE附带了自己的持久性API&#xff1a;JPA。 当您想要将RDBMS实体&#xff08;表/关系&#xff09;映射到Java实体&#xff08;类&#xff09;时&#xff0c;JPA最强大&#xff0c;主要遵循1&#xff1a;1映射策略。 其背后的想法是&#xff0c;业务逻辑通常并不像关系代数…

mysql备份需要停应用吗_对于含有innodb表的实例进行文件拷贝备份时必须停mysql实例吗...

展开全部在实际环境中&#xff0c;62616964757a686964616fe59b9ee7ad9431333361313261时不时需要备份恢复单个或多个表(注意&#xff1a;这里除非明确指定&#xff0c;所说的表一律指InnoDB表)&#xff0c;而对于innodb引擎恢复单个表需要整体的恢复&#xff0c;xtrabackup也可…

Apache Camel 2.16发布–十大亮点

Apache Camel 2.16于上周五发布。 这篇博客文章是我尝试在此新版本中进行前10名&#xff08;加1作为奖励&#xff09;的亮点。 1.动态到 来自骆驼用户的最常见的常见问题是如何将消息发送到端点&#xff0c;uri应该使用消息中的动态值&#xff08;例如标头&#xff09;。 在…

[原创软件]体验组批量加分工具

软件主要功能&#xff1a; 从excel批量导入用户QQ、昵称、年龄信息批量粘贴用户QQ或昵称进行筛选批量添加积分软件界面截图&#xff1a; 开发环境及语言&#xff1a; c#.NET Framework 4.0Visual Studio 2015更新日志&#xff1a; v1.2&#xff08;2016.9.30&#xff09; 增加格…

java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)

线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素&#xff0c;这种表示也称作线性表的顺序存储结构或顺序映像。通常&#xff0c;称这种存储结构的线性表为顺序表。特点是&#xff1a;逻辑上相邻的数据元素&#xff0c;其物理次序上也是相邻的。顺序表…

akka连接是什么_什么是Akka?

akka连接是什么在深入探讨什么是Akka之前&#xff0c;让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现&#xff0c;应用程序设计演变为更多的基于流程或任务的设计模型…

c java 系统开发_java开发系统内核:使用C语言开发系统应用程序

更详细的讲解和代码调试演示过程&#xff0c;请参看视频用java开发C语言编译器如果你对机器学习感兴趣&#xff0c;请参看一下链接&#xff1a;机器学习&#xff1a;神经网络导论我们的操作系统通过增添内核接口导出机制后&#xff0c;已经可以作为平台&#xff0c;运行应用程序…

抑制java对修饰符的检查_Java 7对抑制异常的支持

抑制java对修饰符的检查在JDK 7中 &#xff0c;向Throwable类&#xff08; Exception和Error类的父类&#xff09;添加了一个新的构造函数和两个新方法。 添加了新的构造函数和两个新方法以支持“抑制的异常”&#xff08;不要与吞咽或忽略异常的不良做法相混淆&#xff09;。 …

编写基于事件的CQRS读取模型

关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是&#xff0c;尽管也有一些有趣的考虑&#xff0c;但读取模型经常被忽略。 在本文中&#xff0c;我们将展示一个通过使用事件流填充视图模型的示例实现。 总览 读取模型的想法…

java else if和switch_如何优雅地优化代码中的的if else和switch

引言一般来说&#xff0c;随着我们项目的迭代以及业务的越来越复杂&#xff0c;项目中的分支判断会原来越多。当项目中涉及到复杂的业务判断或者分支逻辑时&#xff0c;我们就需要考虑是否需要对项目进行重构了&#xff0c;或者if else和switch case是否能够满足当前项目的复杂…

jQuery data

一个简单的Cache (function(){var __cache {},Cache {get: function(__name){return __cache[__name] || undefined;}, set: function(__name, __value){return (__cache[__name] __value)}};this.Cache Cache; })();alert(Cache.get("name")); //undefine…

设计模式(中介者模式-对象去耦)

声明&#xff1a;本系列文章内容摘自《iOS设计模式》 中介者模式 用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 何时使用中介者模式 1.对象间的交互虽定义明确然而非…

windows服务器的DDOS防御,

抵御 SYN 攻击 SYN 攻击利用了 TCP/IP 连接建立机制中的安全漏洞。要实施 SYN 洪水攻击&#xff0c;攻击者会使用程序发送大量 TCP SYN 请求来填满服务器上的挂起连接队列。这会禁止其他用户建立网络连接。 要保护网络抵御 SYN 攻击&#xff0c;请按照下面这些通用步骤操作&…

java程序运行结果题_2016年关于Java编程与程序运行结果笔试题

2016年关于Java编程与程序运行结果笔试题1.Java编程,打印昨天的当前时刻public class YesterdayCurrent{public void main(String[] args){Calendar cal Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}}2.文件读写,实现一个计数器pu…

Hystrix简介– Hello World

在先前的博客文章中&#xff0c;我谈到了需要像Netflix Hystrix这样的库的动机。 在这里&#xff0c;我将跳入一些非常基本的方法来开始使用Hystrix&#xff0c;并在更复杂的用例中进行后续介绍。 你好&#xff0c;世界 以下是“ Hystrix命令”的一个简单的Hello World示例&am…