Java設(shè)計(jì)模式之策略模式深入刨析
1.基本介紹
1)策略模式(Strategy Pattern)中,定義算法族(策略組),分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶
2)這算法體現(xiàn)了幾個(gè)設(shè)計(jì)原則,第一,把變化的代碼從不變的代碼中分離出來;第二,針對(duì)接口編程而不是具體類(定義了策略接口);第三,多用組合/聚合,少用繼承(客戶通過組合方式使用策略)
例如:針對(duì)環(huán)境節(jié)能,提出了三種節(jié)能方式:基帶板節(jié)能,SPC節(jié)能,產(chǎn)品節(jié)能,不同的節(jié)能方式,對(duì)環(huán)境設(shè)備的具體處理流程不同
2.傳統(tǒng)方式
(1)類圖
(2)編碼實(shí)現(xiàn)
1)定義一個(gè)EsPolicy抽象類,定義esPolicyHandler方法
public abstract class EsPolicy { public void esPolicyHandler() { } }
2)BbEsPolicy繼承EsPolicy,并復(fù)寫esPolicyHandler方法
public class BbEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===處理基帶板節(jié)能策略==="); } }
3)SpcEsPolicy繼承EsPolicy,并復(fù)寫esPolicyHandler方法
public class SpcEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===Spc節(jié)能策略處理==="); } }
4)ProdEsPolicy繼承EsPolicy,并復(fù)寫esPolicyHandler方法
public class ProdEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===產(chǎn)品節(jié)能策略處理==="); } }
5)測試
public class EsPolicyTest { public static void main(String[] args) { EsPolicy bbEsPolicy = new BbEsPolicy(); bbEsPolicy.esPolicyHandler(); SpcEsPolicy spcEsPolicy = new SpcEsPolicy(); spcEsPolicy.esPolicyHandler(); ProdEsPolicy prodPolicy = new ProdEsPolicy(); prodPolicy.esPolicyHandler(); } }
執(zhí)行結(jié)果
===處理基帶板節(jié)能策略===
===Spc節(jié)能策略處理===
===產(chǎn)品節(jié)能策略處理===
問題:傳統(tǒng)方法是通過子類繼承父類并復(fù)寫父類方法來實(shí)現(xiàn)不同子類的不同行為,對(duì)類的局部改動(dòng),尤其是超類的局部改動(dòng),會(huì)影響其它部分,會(huì)有溢出效應(yīng)
3.采用策略模式
(1)類圖
(2)編碼實(shí)現(xiàn)
1)定義策略接口并定義抽象方法
public interface EsPolicyHandler { void esPolicyHandler(); }
2)BbEsPolicyHandler實(shí)現(xiàn)策略接口,并實(shí)現(xiàn)esPolicyHandler方法
public class BbEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===基帶板節(jié)能策略處理==="); } }
3)SpcEsPolicyHandler實(shí)現(xiàn)策略接口,并實(shí)現(xiàn)esPolicyHandler方法
public class SpcEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===Spc節(jié)能策略處理==="); } }
4)ProdEsPolicyHandler實(shí)現(xiàn)策略接口,并實(shí)現(xiàn)esPolicyHandler方法
public class ProdEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===產(chǎn)品節(jié)能策略處理==="); } }
5)定義EsPolicy抽象類,注入EsPolicyHandler作為其屬性
public abstract class EsPolicy { EsPolicyHandler esPolicyHandler; public void setEsPolicyHandler(EsPolicyHandler esPolicyHandler) { this.esPolicyHandler = esPolicyHandler; } public void esPolicyHandler() { if (null != esPolicyHandler) { esPolicyHandler.esPolicyHandler(); } } }
6)BbEsPolicy繼承EsPolicy,在構(gòu)造方法中實(shí)例化esPolicyHandler接口屬性
public class BbEsPolicy extends EsPolicy { public BbEsPolicy() { esPolicyHandler = new BbEsPolicyHandler(); } }
7)SpcEsPolicy繼承EsPolicy,在構(gòu)造方法中實(shí)例化esPolicyHandler接口屬性
public class SpcEsPolicy extends EsPolicy { public SpcEsPolicy() { esPolicyHandler = new SpcEsPolicyHandler(); } }
8)ProdEsPolicy繼承EsPolicy,在構(gòu)造方法中實(shí)例化esPolicyHandler接口屬性
public class ProdEsPolicy extends EsPolicy { public ProdEsPolicy() { esPolicyHandler = new ProdEsPolicyHandler(); } }
9)測試
public class EsPolicyTest { public static void main(String[] args) { BbEsPolicy bbEsPolicy = new BbEsPolicy(); bbEsPolicy.esPolicyHandler(); SpcEsPolicy spcEsPolicy = new SpcEsPolicy(); spcEsPolicy.esPolicyHandler(); ProdEsPolicy prodEsPolicy = new ProdEsPolicy(); prodEsPolicy.esPolicyHandler(); } }
10)執(zhí)行結(jié)果
===處理基帶板節(jié)能策略===
===Spc節(jié)能策略處理===
===產(chǎn)品節(jié)能策略處理===
4.策略模式的注意事項(xiàng)和細(xì)節(jié)
1)策略模式的關(guān)鍵是:分析項(xiàng)目中變化部分與不變部分
2)策略模式的核心思想是:多用組合/聚合,少用繼承;用行為類組合,而不是行為的繼承,更有彈性;
3)體現(xiàn)了“對(duì)修改關(guān)閉,對(duì)擴(kuò)展開放”原則,客戶端增加行為而不用修改原有的代碼,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語句(if…else if…else)
4)提供了可以替換繼承關(guān)系的辦法:策略模式將算法封裝在獨(dú)立的Strategy類中使得你可以獨(dú)立于其Context改變它,使它易于切換、易于理解、易于擴(kuò)展
5)需要注意的是:每添加一個(gè)策略就要增加一個(gè)類,當(dāng)策略過多是會(huì)導(dǎo)致類數(shù)量龐大
到此這篇關(guān)于Java設(shè)計(jì)模式之策略模式示例詳解的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+WebMagic實(shí)現(xiàn)網(wǎng)頁爬蟲的示例代碼
本文是對(duì)spring?boot+WebMagic+MyBatis做了整合,使用WebMagic爬取數(shù)據(jù),然后通過MyBatis持久化爬取的數(shù)據(jù)到mysql數(shù)據(jù)庫,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Springboot 2.x集成kafka 2.2.0的示例代碼
kafka近幾年更新非??欤部梢钥闯鰇afka在企業(yè)中是用的頻率越來越高。本文主要為大家介紹了Springboot 2.x集成kafka 2.2.0的示例代碼,需要的可以參考一下2022-04-04Springmvc處理ajax請(qǐng)求并返回json數(shù)據(jù)
這篇文章主要介紹了Springmvc處理ajax請(qǐng)求并返回json數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java實(shí)現(xiàn)的猜數(shù)字游戲示例
這篇文章主要介紹了Java實(shí)現(xiàn)的猜數(shù)字游戲,涉及Java數(shù)學(xué)運(yùn)算與判斷相關(guān)操作技巧,需要的朋友可以參考下2018-06-06Java分布式鎖理論(redis、zookeeper))案例詳解
zookeeper有個(gè)節(jié)點(diǎn)路徑的概念,節(jié)點(diǎn)路徑不能重復(fù),保證了唯一性,這篇文章給大家介紹Java分布式鎖理論(redis、zookeeper)?案例詳解,感興趣的朋友跟隨小編一起看看吧2024-01-01Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過程
以前做導(dǎo)出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關(guān)于Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)
這篇文章主要介紹了使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09