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

策略模式示例代码

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是策略模式 3.实施策略设计模式 4.何时使用策略设计模式 5. JDK中的策略模式 6.下载源代码

1.简介

策略设计模式似乎是所有设计模式中最简单的,但它为代码提供了极大的灵活性。 即使与其他设计模式结合使用,该模式也几乎用于所有地方。 到目前为止,我们讨论的模式都与该模式有直接或间接的关系。 学完本课后,您将了解这种模式的重要性。

为了理解策略设计模式,让我们为文本编辑器创建文本格式化程序。 每个人都应该知道一个文本编辑器。 文本编辑器可以具有不同的文本格式化程序来格式化文本。 我们可以创建不同的文本格式化程序,然后将所需的文本格式化程序传递给文本编辑器,以便该编辑器能够根据需要格式化文本。

文本编辑器将保存对文本格式化程序通用接口的引用,并且编辑者的工作是将文本传递给格式化程序以格式化文本。

让我们使用“策略设计模式”来实现这一点,这将使代码非常灵活且可维护。 但是在此之前,让我们更多地了解战略设计模式。

2.什么是策略模式

策略设计模式定义了一系列算法,将每个算法封装在一起,并使它们可互换。 策略使算法独立于使用该算法的客户端而变化。

当存在一组相关算法并且客户对象需要能够从该组动态选择适合其当前需求的算法时,策略模式很有用。 策略模式建议将每种算法的实现都放在单独的类中。 封装在单独类中的每个此类算法都称为strategy 。 使用Strategy对象的对象通常称为context对象。

有了不同的Strategy对象,更改Context对象的行为仅是将其Strategy对象更改为实现所需算法的对象。 为了使Context对象能够无缝地访问不同的Strategy对象,必须将所有Strategy对象设计为提供相同的接口。 在Java编程语言中,这可以通过将每个Strategy对象设计为公共接口的实现者或声明所需公共接口的公共抽象类的子类来实现。

一旦将相关算法组封装在类层次结构中的一组Strategy类中,客户端就可以通过选择并实例化适当的Strategy类从这些算法中进行选择。 要更改context的行为,客户端对象需要使用选定的strategy实例配置context 。 这种安排将算法的实现与使用它的context完全分开。 结果,当更改现有算法实现或将新算法添加到组时, context和使用该context的客户端对象都不会受到影响。

图1-策略类图

图1 –策略类图

战略

  • 声明所有支持的算法通用的接口。 Context使用此接口来调用ConcreteStrategy定义的算法。

具体策略

  • 使用Strategy接口实现算法。

语境

  • 配置有ConcreteStrategy对象。
  • 维护对Strategy对象的引用。
  • 可以定义一个接口,使Strategy可以访问其数据。

3.实施策略设计模式

下面是所有具体格式化程序的TextFormatter接口工具。

package com.javacodegeeks.patterns.strategypattern;public interface TextFormatter {public void format(String text);}

上面的接口仅包含一种用于格式化文本的方法format

package com.javacodegeeks.patterns.strategypattern;public class CapTextFormatter implements TextFormatter{@Overridepublic void format(String text) {System.out.println("[CapTextFormatter]: "+text.toUpperCase());}}

上面的类CapTextFormatter是实现TextFormatter接口的具体文本格式化程序,该类用于将文本更改为大写字母。

package com.javacodegeeks.patterns.strategypattern;public class LowerTextFormatter implements TextFormatter{@Overridepublic void format(String text) {System.out.println("[LowerTextFormatter]: "+text.toLowerCase());}}

LowerTextFormatter是一个具体的文本格式化程序,它实现了TextFormatter接口,该类用于将文本更改为小写形式。

package com.javacodegeeks.patterns.strategypattern;public class TextEditor {private final TextFormatter textFormatter;public TextEditor(TextFormatter textFormatter){this.textFormatter = textFormatter;}public void publishText(String text){textFormatter.format(text);}}

上面的类是TextEditor类,其中包含对TextFormatter接口的引用。 该类包含publishText方法,该方法将文本转发给格式化程序,以便以所需格式发布文本。

现在,让我们测试上面的代码。

package com.javacodegeeks.patterns.strategypattern;public class TestStrategyPattern {public static void main(String[] args) {TextFormatter formatter = new CapTextFormatter();TextEditor editor = new TextEditor(formatter);editor.publishText("Testing text in caps formatter");formatter = new LowerTextFormatter();editor = new TextEditor(formatter);editor.publishText("Testing text in lower formatter");}}

上面的代码将导致以下输出:

[CapTextFormatter]: TESTING TEXT IN CAPS FORMATTER
[LowerTextFormatter]: testing text in lower formatter

在上面的类中,我们首先创建了一个CapTextFormatter并将其分配给TextEditor实例。 然后,我们调用publishText方法并将一些输入文本传递给它。

同样,我们做了同样的事情,但是这次, LowerTextFormatter被传递给TextEditor

由于输出所使用的文本格式化程序不同,因此输出清楚地显示了不同文本编辑器产生的不同文本格式。

策略设计模式的主要优点是我们可以轻松地增强代码。 我们可以添加新的文本格式化程序,而不会打扰当前代码。 这将使我们的代码可维护和灵活。 这种设计模式还促进了“代码到接口”的设计原则。

4.何时使用策略设计模式

在以下情况下使用策略模式:

  • 许多相关的类仅在行为上有所不同。 策略提供了一种使用多种行为之一配置类的方法。
  • 您需要算法的不同变体。 例如,您可以定义反映不同时空权衡的算法。 将这些变体实现为算法的类层次结构时,可以使用策略。
  • 一种算法使用客户端不应该知道的数据。 使用策略模式可避免暴露复杂的,特定于算法的数据结构。
  • 一个类定义了许多行为,这些行为在其操作中显示为多个条件语句。 代替许多条件,将相关的条件分支移到其自己的Strategy类中。

5. JDK中的策略模式

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()

6.下载源代码

这是关于策略设计模式的课程。 您可以在此处下载源代码: StrategyPattern-Project

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

策略模式示例代码

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

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

相关文章

加白名单_Android保活从入门到放弃:乖乖引导用户加白名单吧

1、引言IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见《Android P正式版即将到来:后台应用保活、消息推送的真正噩梦》),保活从黑科技横行的时代进入了技术…

子模板继承父模板示例_模板设计模式示例

子模板继承父模板示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看…

10个超赞的C语言开源项目!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删今天分享10个超赞的C语言开源项目,希望这些内容能对大家有所帮助!目录:1. Webbench2. Tinyhttpd3. cJSON4. C…

jboss eap 7_使用JBoss EAP 7的HTTP / 2

jboss eap 7就在几天前,新的JBoss EAP 7 ALPHA版本已经发布。 而且我已经写过博客,介绍如何开始使用它 。 一个非常有趣的部分是HTTP / 2支持,它已作为技术预览添加。 它由新的Web服务器Untertow提供。 HTTP / 2通过压缩头并在同一TCP连接上多…

Modern C++ 最核心的变化是什么?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删个人觉得最核心的变化是右值引用的引入,右值引用是 C 走向现代化的最重要一步。建议每一位 C 开发者都应该深入去了解并充分使用它。…

设计模式示例_命令设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

第一个C语言编译器是怎样编写的

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是“鸡生蛋,蛋生鸡”的问题吗&#xff1…

备忘录模式 命令模式_备忘录设计模式示例

备忘录模式 命令模式本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 …

还在分析我写的 bug 啊,我都是随便写的!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删还在分析我写的 bug 啊,我都是随便写的!客户就是可以为所欲为,怎么地!下面教大家如何对付产品经理…

mysql如何让表建立连接吗_MySQL 表与表之间建立关系

引子:如下图是一张非常寻常的表格,在以前的工作中实常会制作类似的表格,但是今天的数据库内容,将我之前这种传统的制表思路上升了一个层次;今天核心的内容就是怎样让表与表之间产生关系,在思考这个问题的时…

访客模式 无痕模式 区别_访客设计模式示例

访客模式 无痕模式 区别本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查…

项目经理升职了是啥_什么是升职率?

项目经理升职了是啥我确实相信您熟悉彼得原则 。 一般而言,该原则是一种观察,即晋升可能会并且将导致晋升人员不再符合工作资格的情况。 对于JVM,存在类似的问题。 太快地提升对象可能会对性能产生重大影响。 在这篇文章中,我们将…

mysql事件定时_MySQL事件(定时任务)

whats the MySQL 事件MySQL5.1 版本开始引进 event 概念,MySQL 中的事件(event:时间触发器)是用于执行定时或周期性的任务,类似 Linux 中的 crontab,事件可以精确到秒。通过单独或调用存储过程使用,在某一特定的时间点…

lucene简介_Lucene简介

lucene简介本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中&…

jsp mysql 插入数据_jsp连接MySQL实现插入insert操作功能示例

下午终于实现了jsp连接MySQL执行插入操作的功能。在index.jsp页面输入数据,提交到mysql——insert.jsp页面进行插入数据库的操作。index.jsp页面代码如下:request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8&…

swagger生成示例_生成器设计模式示例

swagger生成示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &…

设计模式适配器模式_适配器设计模式示例

设计模式适配器模式本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &…

mysql mgr bug_Mysql MGR架构误操作引发的问题处理

【背景介绍】故障方描述:一次用户刷权限的时候不小心把数据库用户表记录删掉了,执行之后发现不对后重建用户,杀掉进程后重新MGR启动报错。【报错信息】2018-06-13T12:47:41.405593Z 32 [Note] Plugin group_replication reported: Group comm…

css外墙法_外墙设计模式示例

css外墙法本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff0…

设计模式示例_桥梁设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…