Java設(shè)計(jì)模式之策略模式深入刨析
1.基本介紹
1)策略模式(Strategy Pattern)中,定義算法族(策略組),分別封裝起來(lái),讓他們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶
2)這算法體現(xiàn)了幾個(gè)設(shè)計(jì)原則,第一,把變化的代碼從不變的代碼中分離出來(lái);第二,針對(duì)接口編程而不是具體類(lèi)(定義了策略接口);第三,多用組合/聚合,少用繼承(客戶通過(guò)組合方式使用策略)
例如:針對(duì)環(huán)境節(jié)能,提出了三種節(jié)能方式:基帶板節(jié)能,SPC節(jié)能,產(chǎn)品節(jié)能,不同的節(jié)能方式,對(duì)環(huán)境設(shè)備的具體處理流程不同
2.傳統(tǒng)方式
(1)類(lèi)圖

(2)編碼實(shí)現(xiàn)
1)定義一個(gè)EsPolicy抽象類(lèi),定義esPolicyHandler方法
public abstract class EsPolicy {
public void esPolicyHandler() {
}
}
2)BbEsPolicy繼承EsPolicy,并復(fù)寫(xiě)esPolicyHandler方法
public class BbEsPolicy extends EsPolicy {
@Override
public void esPolicyHandler() {
System.out.println("===處理基帶板節(jié)能策略===");
}
}3)SpcEsPolicy繼承EsPolicy,并復(fù)寫(xiě)esPolicyHandler方法
public class SpcEsPolicy extends EsPolicy {
@Override
public void esPolicyHandler() {
System.out.println("===Spc節(jié)能策略處理===");
}
}
4)ProdEsPolicy繼承EsPolicy,并復(fù)寫(xiě)esPolicyHandler方法
public class ProdEsPolicy extends EsPolicy {
@Override
public void esPolicyHandler() {
System.out.println("===產(chǎn)品節(jié)能策略處理===");
}
}
5)測(cè)試
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é)能策略處理===
問(wèn)題:傳統(tǒng)方法是通過(guò)子類(lèi)繼承父類(lèi)并復(fù)寫(xiě)父類(lèi)方法來(lái)實(shí)現(xiàn)不同子類(lèi)的不同行為,對(duì)類(lèi)的局部改動(dòng),尤其是超類(lèi)的局部改動(dòng),會(huì)影響其它部分,會(huì)有溢出效應(yīng)
3.采用策略模式
(1)類(lèi)圖

(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抽象類(lèi),注入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)測(cè)試
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)策略模式的核心思想是:多用組合/聚合,少用繼承;用行為類(lèi)組合,而不是行為的繼承,更有彈性;
3)體現(xiàn)了“對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放”原則,客戶端增加行為而不用修改原有的代碼,只要添加一種策略(或者行為)即可,避免了使用多重轉(zhuǎn)移語(yǔ)句(if…else if…else)
4)提供了可以替換繼承關(guān)系的辦法:策略模式將算法封裝在獨(dú)立的Strategy類(lèi)中使得你可以獨(dú)立于其Context改變它,使它易于切換、易于理解、易于擴(kuò)展
5)需要注意的是:每添加一個(gè)策略就要增加一個(gè)類(lèi),當(dāng)策略過(guò)多是會(huì)導(dǎo)致類(lèi)數(shù)量龐大
到此這篇關(guān)于Java設(shè)計(jì)模式之策略模式示例詳解的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)Java HashMap,看這篇就夠了
這篇文章主要介紹了Java HashMap的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
詳解SpringMVC @RequestBody接收J(rèn)son對(duì)象字符串
這篇文章主要介紹了詳解SpringMVC @RequestBody接收J(rèn)son對(duì)象字符串,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
SpringBoot中支持Https協(xié)議的實(shí)現(xiàn)
本文主要介紹了SpringBoot中支持Https協(xié)議的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
重學(xué)SpringBoot3之如何發(fā)送Email郵件功能
這篇文章主要給大家介紹了重學(xué)SpringBoot3之如何發(fā)送Email郵件功能的相關(guān)資料,文中包括環(huán)境準(zhǔn)備、項(xiàng)目配置、代碼實(shí)現(xiàn)、最佳實(shí)踐和安全性建議,通過(guò)采用異步發(fā)送、重試機(jī)制、限流等最佳實(shí)踐,可以構(gòu)建一個(gè)健壯的郵件發(fā)送系統(tǒng),需要的朋友可以參考下2024-11-11
Java常見(jiàn)數(shù)據(jù)結(jié)構(gòu)面試題(帶答案)
這篇文章主要介紹了Java常見(jiàn)數(shù)據(jù)結(jié)構(gòu)面試題,帶有答案及解釋,希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下。2017-09-09
java獲取兩個(gè)數(shù)組中不同數(shù)據(jù)的方法
這篇文章主要介紹了java獲取兩個(gè)數(shù)組中不同數(shù)據(jù)的方法,實(shí)例分析了java操作數(shù)組的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
SpringBoot實(shí)現(xiàn)上傳文件到AWS S3的代碼
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)上傳文件到AWS S3的代碼,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10

