本文是我们名为“ 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
的客户端对象都不会受到影响。
战略
- 声明所有支持的算法通用的接口。
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