最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java設計模式--策略模式詳解

 更新時間:2021年07月19日 11:17:13   作者:吾仄lo咚鏘  
這篇文章主要介紹了Java經典設計模式之策略模式,簡單說明了策略模式的概念、原理并結合實例形式分析了java策略模式的具有用法與相關注意事項,需要的朋友可以參考下

策略模式

策略模式(Strategy Pattern)屬于行為型模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現(xiàn)算法。用算法族分別封裝起來,實現(xiàn)同一個接口,讓他們之間可以互相替換,讓算法的變化獨立于使用算法的客戶。

  • 主要解決:在有多種算法相似的情況下,使用 if…else 所帶來的復雜和難以維護。
  • 如何解決:將這些算法封裝成一個一個的類,任意地替換。
  • 何時使用:一個系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為。

使用場景:

  • 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。
  • 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
  • 如果一個對象有很多的行為,如果不用恰當?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)。
優(yōu)點 缺點
算法可以自由切換 策略類會增多
避免使用多重條件判斷 所有策略類都需要對外暴露
擴展性良好

在這里插入圖片描述

  • 環(huán)境類(Context):持有抽象策略類的引用,用來操作策略的上下文環(huán)境。
  • 抽象策略類(Strategy):策略的抽象類或接口,給出所需實現(xiàn)接口。
  • 具體策略類(ConcreteStrategy):具體的策略實現(xiàn)。

Demo

有幾種鵝:天鵝、野鵝、灰鵝,鵝有各種行為,如飛、游泳、叫等。

假設天鵝灰鵝飛行能力一般,野鵝飛行能力優(yōu)秀;天鵝野鵝游泳能力一般,灰鵝游泳能力優(yōu)秀。

首先看第一種方法:

在這里插入圖片描述

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

在這里插入圖片描述

代碼:

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()); //改變某個對象的行為
        greyGoose.flyBehavior.fly();
    }
}

運行結果:

在這里插入圖片描述

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Java遍歷輸出指定目錄、樹形結構所有文件包括子目錄下的文件

    Java遍歷輸出指定目錄、樹形結構所有文件包括子目錄下的文件

    這篇文章主要介紹了Java遍歷輸出指定目錄、樹形結構下的所有文件包括子目錄中的文件,需要的朋友可以參考下
    2015-07-07
  • SpringCloud Gateway的路由,過濾器和限流解讀

    SpringCloud Gateway的路由,過濾器和限流解讀

    這篇文章主要介紹了SpringCloud Gateway的路由,過濾器和限流解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • SpringBoot自定義HttpMessageConverter操作

    SpringBoot自定義HttpMessageConverter操作

    這篇文章主要介紹了SpringBoot自定義HttpMessageConverter的操作,具有很好的參考價值,如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解SpringBoot基于Dubbo和Seata的分布式事務解決方案

    詳解SpringBoot基于Dubbo和Seata的分布式事務解決方案

    這篇文章主要介紹了詳解SpringBoot基于Dubbo和Seata的分布式事務解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • SpringBoot如何讀取war包jar包和Resource資源

    SpringBoot如何讀取war包jar包和Resource資源

    這篇文章主要介紹了SpringBoot如何讀取war包jar包和Resource資源,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Java中Druid連接池連接超時獲取不到連接的解決

    Java中Druid連接池連接超時獲取不到連接的解決

    這篇文章主要介紹了Java中Druid連接池連接超時獲取不到連接的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java 中jasperReport實現(xiàn)動態(tài)列打印的實現(xiàn)代碼

    Java 中jasperReport實現(xiàn)動態(tài)列打印的實現(xiàn)代碼

    這篇文章主要介紹了Java 中jasperReport實現(xiàn)動態(tài)列打印的實現(xiàn)代碼的相關資料,希望通過本文大家能掌握這部分內容,需要的朋友可以參考下
    2017-09-09
  • Spring 配置文件字段注入到List、Map

    Spring 配置文件字段注入到List、Map

    這篇文章主要介紹了Spring 配置文件字段注入到List、Map,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • JVM(Java虛擬機)簡介(動力節(jié)點Java學院整理)

    JVM(Java虛擬機)簡介(動力節(jié)點Java學院整理)

    Java虛擬機(Jvm)是可運行Java代碼的假想計算機。Java虛擬機包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。對java jvm 虛擬機感興趣的朋友通過本文一起學習吧
    2017-04-04
  • SpringBoot在接收參數(shù)的七種方式詳解

    SpringBoot在接收參數(shù)的七種方式詳解

    這篇文章主要介紹了SpringBoot在接收參數(shù)的七種方式詳解,隨著前后端的分離,接口方式開發(fā)成為普遍的開發(fā)形式,前端相對于后端來說,常用的接口傳參方式就一定要了解和熟悉,下面?我們梳理了常用的七種?Controller層接受參數(shù)的方式,需要的朋友可以參考下
    2023-10-10

最新評論

蓝田县| 崇州市| 深圳市| 南安市| 宁明县| 潼关县| 馆陶县| 南平市| 东平县| 大渡口区| 合阳县| 柳江县| 贞丰县| 凌云县| 海南省| 孙吴县| 望奎县| 中西区| 视频| 门源| 洱源县| 兴安县| 苏州市| 通州区| 祁连县| 荣昌县| 岫岩| 凌云县| 棋牌| 武胜县| 东阳市| 榆林市| 南昌县| 天气| 定远县| 怀柔区| 沾化县| 张北县| 增城市| 四川省| 林芝县|