策略设计模式示例

本文是我们名为“ 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/356924.shtml

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

相关文章

vscode修改json.maxItemsComputed配置解决提示

由于要测试明细查询打印业务,分页每页显示30行,要打印30页以上的数据,在打印的过程中会出现分页的问题,这里使用仿真工具测试,需要修改mock数据,造数据,超过5000行就有提示了,需要扩…

【面试题系列|前端面试题】前端高频面试题总结(2021年最新版)

面试过不少前端从业者,简历写的平平淡淡,别人会的技能他也都会,看起来什么都掌握一些;有些会请过来当面聊一下,有些就直接拒绝了(如果是公司内要求独立完成项目的岗位,简历里放很多学习时候的DE…

观察者设计模式示例

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

震惊!2021年数十个技术领域图谱曝光,包含Golang、区块链、人工智能、架构师等领域学习路线

前言:不知道你是否和我一样,刚开始学习某个技术领域的时候缺乏坚持的动力,没有一个清晰的学习路线,学习的过程中没有人指导,遇到问题没人一起解答,想深入学习某个领域而又无从下手,不知道该从何处学起?这不,你想要的技术图谱来啦。有了这款武功秘籍,不光能开阔视野,…

70多套java必练项目,适合小白上手!

导读:这些项目不管是找工作练手,还是公司使用当作模板进一步改进,亦或者是当作毕业设计,都很有借鉴意义! 编译器建议使用:IDEA,Myeclipse,eclipse,HB-X等都可以。 数据库建议使用,mysql,oracle,…

mysql mycat 路由规则_Mycat分库路由规则

Mycat分库路由规则发布时间:2020-06-15 16:54:10来源:51CTO阅读:11651作者:lzf05303774一、Mycat分库路由分为连续路由和离散路由。1、连续路由:(1)、常用的路由方式:auto-sharding-long、sharding-by-date…

孙叫兽CSDN社区云----WebIT已创建,欢迎大家前端全栈小伙伴踊跃加入

目录 社区云是什么? 创建CSDN社区云WebIT的目的 推荐分享的技术点(如下图所示) 社区成员权益 版主权益 管理员权益 WebIT社区云积分规则 WebIT优质版主及管理员可以申请直播分享前端技术 WebIT社区云将为社区运营者提供: …

迭代器设计模式示例

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

uibinder表单提交_使用UIBinder的GWT自定义按钮

uibinder表单提交这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandl…

python用import xlwt出现红字_如何用python处理excel

最近看到有很多的python课程是教人怎么用python处理excel,我看了一下价格收费还贼高...这么初级毫无水平的操作我的粉丝们就不要花钱去报课程了..我免费教你们怎么做.首先我们先要安装两个模块,一个叫做xlrd,一个是xlwt.安装如下:打开cmd输入pip install xlrd等待安装成功,成功…

什么是升职率?

我确实相信您熟悉彼得原则 。 一般而言,该原则是一种观察,即晋升可能并且将导致晋升人员不再符合该职位的条件。 对于JVM,存在类似的问题。 太快地提升对象可能会对性能产生重大影响。 在这篇文章中,我们将探讨提升率的概念&…

mysql自增id用完了_MySQL表自增id用完了该怎么办?

我们知道MySQL表可以定义一个自增长的id,如果我们的表没有指定主键字段,那MySQL会给我们的表创建一个不可见的,长度为6个自己的row_id,然后不停地往上加步长,虽然生活中自然数是没有上限的,但是在计算机里&…

jmeter插件监控cpu小节点

JMeter使用plugins插件进行服务器性能监控 性能测试时,我们的关注点有两部分 1 服务本身:并发响应时间 QPS 2 服务器的资源使用情况:cpu memory I/O disk等 JMeter的plugins插件可以实现对"二"的监控,具体操作步骤如下(…

mysql写入监控_zabbix监控mysql操作

说明:配置zabbix自带Mysql模板# 创建目录mkdir /var/lib/zabbix# 创建连接数据库文件touch /var/lib/zabbix/.my.cnf# 写入数据连接信息[client]host 192.168.0.148user rootpassword 123dffsdfs# 创建监控项文件touch /etc/zabbix/zabbix_agentd.conf.d/userpar…

openshift_云上的播放框架变得简单:Openshift模块

openshift仅仅几年前,找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务,而寻找免费的托管解决方案是一项不可能的任务。 更不用说考虑自动缩放,单命令部署,持续集成等问题了,这简直就是科幻小说。 去年…

xclock 不出来界面_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示

更多奇技淫巧欢迎订阅博客:https://fuckcloudnative.io前言在 Windows 中相信大家已经很熟悉使用 Xmanager(Xshell), MobaXterm, SecureCRT 通过 X11 实现 Linux 图形化界面显示,我的需求是在 macOS 下使用 iTerm2 作为 Terminal 实现 X11 图形化界面显示…

命令设计模式示例

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

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试 原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试第一篇、GP降雨量等值线建模、发布及测试在水利、气象等行业中,要在WebGIS中实现空间分析功能,如绘制等…

win10企业版更新和安全中没有 “恢复”这个选项_通知:微软已强制对Windows 10更新升级...

最近,微软发布了Windows10的强制升级。从本月开始,如果您的个人电脑、笔记本电脑和其他设备没有手动升级,微软将强制部分用户升级到Windows10 1909或2004版本。原因很简单。微软已经停止支持Windows10 1903版(包括家庭版和专业版&…

docker 多个mysql_mysql8.0 利用docker容器安装配置多主多从集群

1. 在/user/local/share/下创建mysql文件夹,在mysql文件夹目录下创建4个文件夹分别是:master1, master2, slave1, slave2分别在每个目录下建立data, conf, logs用于数据持久化创建后如下2.创建容器:1)创建一个名为master1的mysql容器(主 mysql)docker ru…