策略设计模式示例
本文是我們名為“ Java設(shè)計(jì)模式 ”的學(xué)院課程的一部分。
在本課程中,您將深入研究大量的設(shè)計(jì)模式,并了解如何在Java中實(shí)現(xiàn)和利用它們。 您將了解模式如此重要的原因,并了解何時(shí)以及如何應(yīng)用模式中的每一個(gè)。 在這里查看 !
目錄
1.簡(jiǎn)介 2.什么是策略模式 3.實(shí)施策略設(shè)計(jì)模式 4.何時(shí)使用策略設(shè)計(jì)模式 5. JDK中的策略模式 6.下載源代碼1.簡(jiǎn)介
策略設(shè)計(jì)模式似乎是所有設(shè)計(jì)模式中最簡(jiǎn)單的,但它為代碼提供了極大的靈活性。 即使與其他設(shè)計(jì)模式結(jié)合使用,該模式也幾乎用于所有地方。 到目前為止,我們討論的模式都與該模式直接或間接相關(guān)。 學(xué)完本課后,您將了解這種模式的重要性。
為了理解策略設(shè)計(jì)模式,讓我們?yōu)槲谋揪庉嬈鲃?chuàng)建文本格式化程序。 每個(gè)人都應(yīng)該知道一個(gè)文本編輯器。 文本編輯器可以具有不同的文本格式化程序來(lái)格式化文本。 我們可以創(chuàng)建不同的文本格式設(shè)置器,然后將所需的格式設(shè)置器傳遞給文本編輯器,以便編輯器可以根據(jù)需要設(shè)置文本格式。
文本編輯器將保存對(duì)文本格式化程序通用接口的引用,編輯器的工作是將文本傳遞給格式化程序以格式化文本。
讓我們使用“策略設(shè)計(jì)模式”來(lái)實(shí)現(xiàn)這一點(diǎn),這將使代碼非常靈活且可維護(hù)。 但是在此之前,讓我們更多地了解戰(zhàn)略設(shè)計(jì)模式。
2.什么是策略模式
策略設(shè)計(jì)模式定義了一系列算法,將每個(gè)算法封裝在一起,并使它們可互換。 策略使算法獨(dú)立于使用該算法的客戶端而變化。
當(dāng)存在一組相關(guān)算法并且客戶端對(duì)象需要能夠從該組動(dòng)態(tài)地選擇適合其當(dāng)前需求的算法時(shí),策略模式很有用。 策略模式建議將每種算法的實(shí)現(xiàn)都放在單獨(dú)的類(lèi)中。 封裝在單獨(dú)類(lèi)中的每個(gè)此類(lèi)算法都稱(chēng)為strategy 。 使用Strategy對(duì)象的對(duì)象通常稱(chēng)為context對(duì)象。
有了不同的Strategy對(duì)象,更改Context對(duì)象的行為僅是將其Strategy對(duì)象更改為實(shí)現(xiàn)所需算法的對(duì)象。 為了使Context對(duì)象能夠無(wú)縫地訪問(wèn)不同的Strategy對(duì)象,必須將所有Strategy對(duì)象設(shè)計(jì)為提供相同的接口。 在Java編程語(yǔ)言中,這可以通過(guò)將每個(gè)Strategy對(duì)象設(shè)計(jì)為公共接口的實(shí)現(xiàn)者或聲明所需公共接口的公共抽象類(lèi)的子類(lèi)來(lái)實(shí)現(xiàn)。
一旦將相關(guān)算法組封裝在類(lèi)層次結(jié)構(gòu)中的一組Strategy類(lèi)中,客戶就可以通過(guò)選擇并實(shí)例化適當(dāng)?shù)腟trategy類(lèi)從這些算法中進(jìn)行選擇。 要更改context的行為,客戶端對(duì)象需要使用選定的strategy實(shí)例配置context 。 這種安排將算法的實(shí)現(xiàn)與使用它的context完全分開(kāi)。 結(jié)果,當(dāng)更改現(xiàn)有算法實(shí)現(xiàn)或?qū)⑿滤惴ㄌ砑拥浇M時(shí), context和使用該context的客戶端對(duì)象都不會(huì)受到影響。
圖1 –策略類(lèi)圖
戰(zhàn)略
- 聲明所有支持的算法通用的接口。 Context使用此接口來(lái)調(diào)用由ConcreteStrategy定義的算法。
具體策略
- 使用Strategy接口實(shí)現(xiàn)算法。
語(yǔ)境
- 配置有ConcreteStrategy對(duì)象。
- 維護(hù)對(duì)Strategy對(duì)象的引用。
- 可以定義一個(gè)接口,使Strategy可以訪問(wèn)其數(shù)據(jù)。
3.實(shí)施策略設(shè)計(jì)模式
下面是所有具體格式化程序的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());}}上面的類(lèi)CapTextFormatter是實(shí)現(xiàn)TextFormatter接口的具體文本格式化程序,該類(lèi)用于將文本更改為大寫(xiě)字母。
package com.javacodegeeks.patterns.strategypattern;public class LowerTextFormatter implements TextFormatter{@Overridepublic void format(String text) {System.out.println("[LowerTextFormatter]: "+text.toLowerCase());}}LowerTextFormatter是一個(gè)具體的文本格式化程序,可實(shí)現(xiàn)TextFormatter接口,該類(lèi)用于將文本更改為小寫(xiě)形式。
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);}}上面的類(lèi)是TextEditor類(lèi),其中包含對(duì)TextFormatter接口的引用。 該類(lèi)包含publishText方法,該方法將文本轉(zhuǎn)發(fā)給格式化程序,以便以所需格式發(fā)布文本。
現(xiàn)在,讓我們測(cè)試上面的代碼。
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");}}上面的代碼將導(dǎo)致以下輸出:
[CapTextFormatter]: TESTING TEXT IN CAPS FORMATTER [LowerTextFormatter]: testing text in lower formatter在上面的類(lèi)中,我們首先創(chuàng)建了一個(gè)CapTextFormatter并將其分配給TextEditor實(shí)例。 然后,我們調(diào)用publishText方法并將一些輸入文本傳遞給它。
同樣,我們做了同樣的事情,但是這次, LowerTextFormatter被傳遞給TextEditor 。
由于輸出所使用的文本格式化程序不同,因此輸出清楚地顯示了不同文本編輯器產(chǎn)生的不同文本格式。
策略設(shè)計(jì)模式的主要優(yōu)點(diǎn)是我們可以輕松地增強(qiáng)代碼。 我們可以添加新的文本格式化程序,而不會(huì)影響當(dāng)前代碼。 這將使我們的代碼可維護(hù)且靈活。 這種設(shè)計(jì)模式還促進(jìn)了“代碼到接口”的設(shè)計(jì)原則。
4.何時(shí)使用策略設(shè)計(jì)模式
在以下情況下使用策略模式:
- 許多相關(guān)的類(lèi)僅在行為上有所不同。 策略提供了一種使用多種行為之一配置類(lèi)的方法。
- 您需要算法的不同變體。 例如,您可以定義反映不同時(shí)空權(quán)衡的算法。 將這些變體實(shí)現(xiàn)為算法的類(lèi)層次結(jié)構(gòu)時(shí),可以使用策略。
- 一種算法使用客戶端不應(yīng)該知道的數(shù)據(jù)。 使用策略模式可避免暴露復(fù)雜的,特定于算法的數(shù)據(jù)結(jié)構(gòu)。
- 一個(gè)類(lèi)定義了許多行為,這些行為在其操作中顯示為多個(gè)條件語(yǔ)句。 代替許多條件,將相關(guān)的條件分支移到他們自己的Strategy類(lèi)中。
5. JDK中的策略模式
- java.util.Comparator#compare()
- javax.servlet.http.HttpServlet
- javax.servlet.Filter#doFilter()
6.下載源代碼
這是關(guān)于策略設(shè)計(jì)模式的課程。 您可以在此處下載源代碼: StrategyPattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/strategy-design-pattern.html
總結(jié)
- 上一篇: 口袋忍者电脑版(忍者大乱斗口袋版官网)
- 下一篇: 电脑怎样下载卡车游戏(好玩的电脑卡车游戏