java設(shè)計(jì)模式--策略模式詳解
策略模式
策略模式(Strategy Pattern)屬于行為型模式,指對(duì)象有某個(gè)行為,但是在不同的場(chǎng)景中,該行為有不同的實(shí)現(xiàn)算法。用算法族分別封裝起來(lái),實(shí)現(xiàn)同一個(gè)接口,讓他們之間可以互相替換,讓算法的變化獨(dú)立于使用算法的客戶。
- 主要解決:在有多種算法相似的情況下,使用 if…else 所帶來(lái)的復(fù)雜和難以維護(hù)。
- 如何解決:將這些算法封裝成一個(gè)一個(gè)的類,任意地替換。
- 何時(shí)使用:一個(gè)系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為。
使用場(chǎng)景:
- 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
- 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。
| 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|
| 算法可以自由切換 | 策略類會(huì)增多 |
| 避免使用多重條件判斷 | 所有策略類都需要對(duì)外暴露 |
| 擴(kuò)展性良好 |

- 環(huán)境類(Context):持有抽象策略類的引用,用來(lái)操作策略的上下文環(huán)境。
- 抽象策略類(Strategy):策略的抽象類或接口,給出所需實(shí)現(xiàn)接口。
- 具體策略類(ConcreteStrategy):具體的策略實(shí)現(xiàn)。
Demo
有幾種鵝:天鵝、野鵝、灰鵝,鵝有各種行為,如飛、游泳、叫等。
假設(shè)天鵝灰鵝飛行能力一般,野鵝飛行能力優(yōu)秀;天鵝野鵝游泳能力一般,灰鵝游泳能力優(yōu)秀。
首先看第一種方法:

這種方法固然可以實(shí)現(xiàn)目的,但問(wèn)題顯而易見,子類過(guò)多覆蓋父類方法,代碼未復(fù)用,耦合度很高。使用策略模式,簡(jiǎn)單來(lái)說(shuō),就是封裝子類行為成接口,父類包含該接口即可。

代碼:
public interface FlyBehavior {
void fly();
}
public class FlyGood implements FlyBehavior {
@Override
public void fly() {
System.out.println("飛行能力優(yōu)秀");
}
}
public class FlyNormal implements FlyBehavior {
@Override
public void fly() {
System.out.println("飛行能力一般");
}
}
public interface SwimBehavior {
void swim();
}
public class SwimGood implements SwimBehavior {
@Override
public void swim() {
System.out.println("游得好");
}
}
public class SwimNormal implements SwimBehavior {
@Override
public void swim() {
System.out.println("游得一般");
}
}
public abstract class Goose {
//策略接口
FlyBehavior flyBehavior;
SwimBehavior swimBehavior;
//其他屬性等...
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setSwimBehavior(SwimBehavior swimBehavior) {
this.swimBehavior = swimBehavior;
}
}
public class Swan extends Goose{
public Swan() {
flyBehavior=new FlyNormal();
swimBehavior=new SwimNormal();
}
}
public class WildGoose extends Goose{
public WildGoose() {
flyBehavior=new FlyGood();
swimBehavior=new SwimNormal();
}
}
public class GreyGoose extends Goose{
public GreyGoose() {
flyBehavior=new FlyNormal();
swimBehavior=new SwimGood();
}
}
public class Client {
public static void main(String[] args) {
Swan swan=new Swan();
swan.flyBehavior.fly();
WildGoose wildGoose=new WildGoose();
wildGoose.swimBehavior.swim();
GreyGoose greyGoose=new GreyGoose();
greyGoose.flyBehavior.fly();
greyGoose.setFlyBehavior(new FlyGood()); //改變某個(gè)對(duì)象的行為
greyGoose.flyBehavior.fly();
}
}
運(yùn)行結(jié)果:

總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖
這篇文章主要介紹了深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Spring Framework遠(yuǎn)程代碼執(zhí)行漏洞分析(最新漏洞)
Spring Framework 是一個(gè)開源應(yīng)用框架,旨在降低應(yīng)用程序開發(fā)的復(fù)雜度,它具有分層體系結(jié)構(gòu),允許用戶選擇組件,同時(shí)還為 J2EE 應(yīng)用程序開發(fā)提供了一個(gè)有凝聚力的框架,對(duì)Spring遠(yuǎn)程代碼執(zhí)行漏洞相關(guān)知識(shí)感興趣的朋友一起看看吧2022-04-04
RabbitMQ冪等性與優(yōu)先級(jí)及惰性詳細(xì)全面講解
關(guān)于MQ消費(fèi)者的冪等性問(wèn)題,在于MQ的重試機(jī)制,因?yàn)榫W(wǎng)絡(luò)原因或客戶端延遲消費(fèi)導(dǎo)致重復(fù)消費(fèi)。使用MQ重試機(jī)制需要注意的事項(xiàng)以及如何解決消費(fèi)者冪等性與優(yōu)先級(jí)及惰性問(wèn)題以下將逐一講解2022-11-11
SpringBoot指標(biāo)監(jiān)控功能實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot指標(biāo)監(jiān)控功能實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
SpringBoot實(shí)現(xiàn)XSS攻擊防御的幾種方式
隨著Web應(yīng)用的普及,網(wǎng)絡(luò)安全問(wèn)題也日益凸顯,跨站腳本攻擊(Cross-Site Scripting,簡(jiǎn)稱XSS)是一種常見的Web安全漏洞,本文旨在探討如何在Spring Boot應(yīng)用程序中有效地防御XSS攻擊,我們將介紹兩種主要的防御手段:注解和過(guò)濾器,需要的朋友可以參考下2024-07-07
使用JAVA+Maven+TestNG框架實(shí)現(xiàn)超詳細(xì)Appium測(cè)試安卓真機(jī)教程
這篇文章主要介紹了使用JAVA+Maven+TestNG框架實(shí)現(xiàn)超詳細(xì)Appium測(cè)試安卓真機(jī)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

