策略设计模式示例

本文是我们名为“ 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…

ibatis中的xml配置文件

<?xml version"1.0" encoding"UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" ><sqlMap namespace"EOC_MUSIC"> <t…

mysql 更新 字段 递增_MySQL使用递增变量更新字段

我的一个数据库中有一个名为“ textile_events”的表。mysql> describe textile_events;---------------------------------------------------------| Field | Type | Key | Default | Extra |---------------------------------------------------------| id | int(11) | …

spring定时注解方式定时写到xml里面融合

把spring注解方式的定时写到xml里面&#xff0c;因为定时常常修改在class里面很不方便代码如下 在xlm <beans 里面加入 xmlns:task"http://www.springframework.org/schema/task" xsi:schemaLocation"里面加入 http://www.springframework.org/schema/task …

mysql数据库实训总结_数据库实训报告

实训报告实训课程&#xff1a;JAVA WEB项目实训实训名称&#xff1a;JAVA项目实训综合能力培养 实训地点&#xff1a;中国江苏无锡国家软件园巨蟹座C601 学生姓名&#xff1a;胥康 学号&#xff1a;140703133 指导教师&#xff1a;张志华实训时间&#xff1a;2016年7月22日实训…

观察者设计模式示例

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

mysql游标表间数据迁移_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表...

-- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟&#xff0c;迁移旧数据到历史表。DELIMITER $$USE dbx$$DROP PROCEDURE IF EXISTS pro_xx$$CREATE PROCEDURE pro_xx()BEGINDECLARE p_oalid INT DEFAULT 0;DECLARE STOP INT DEFAULT 0;DECLARE cur_oalid CURSOR FOR…

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

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

eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3解决方案...

pom文件提示信息&#xff1a; Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.4.3 from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has el…

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

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

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

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

jsf集成spring_Spring和JSF集成:导航

jsf集成spring我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”&#xff0c;因此&#xff0c;如果您签出代码&#xff0c;请注意它是一个不断变化的目标。 期待一些粗糙的边缘&#xff…

关于 asp.net 点击确定按钮 获取不到新值问题

点击事件内&#xff0c;可以使用request.form[" kk"] 获取到值&#xff0c;但是this.txt.Text 确实旧值&#xff0c; 尼玛&#xff0c;居然没加isPostBack重新加载了数据 &#xff0c;request 并没有更改&#xff0c;就是这样。转载于:https://www.cnblogs.com/yZDn/…

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

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

navicat for mysql服务_使用Navicat for MySQL数据库连接服务器中的MySQL服务

本文主要向大家介绍了使用Navicat for MySQL数据库连接服务器中的MySQL服务&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。第一步&#xff1a;登录mysql服务器&#xff0c;新建一个用户。在mysql安装中&#xff0c;默认的有root用户&am…

迭代器设计模式示例

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

noip2013 花匠

P1970 花匠 338通过834提交题目提供者该用户不存在标签动态规划2013NOIp提高组难度普及/提高-提交该题 讨论 题解 记录 最新讨论 一个问题均分&#xff1a; 126.3题目描述 花匠栋栋种了一排花&#xff0c;每株花都有自己的高度。花儿越长越大&#xff0c;也越来越挤。栋栋决定 …

mysql 触发器示例_MySQL触发器示例

触发器是与表有关的数据库对象&#xff0c;在满足定义条件时触发&#xff0c;并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。创建触发器CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_s…

文件系统、mkdir、touch、nano、cp笔记

文件系统&#xff1a;rootfs: 根文件系统FHS&#xff1a;Linux发行版目录层级遵循协议/boot: 系统启动相关的文件&#xff0c;如内核、initrd&#xff0c;以及grub(bootloader)引导加载器/dev: 设备文件 设备文件&#xff1a; 块设备&#xff1a;随机访问&#xff0c…