亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2021年07月19日 11:17:13   作者:吾仄lo咚鏘  
這篇文章主要介紹了Java經(jīng)典設計模式之策略模式,簡單說明了策略模式的概念、原理并結合實例形式分析了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();
    }
}

運行結果:

在這里插入圖片描述

總結

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

相關文章

  • 深入理解Java基礎之try-with-resource語法糖

    深入理解Java基礎之try-with-resource語法糖

    這篇文章主要介紹了深入理解Java基礎之try-with-resource語法糖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Spring Framework遠程代碼執(zhí)行漏洞分析(最新漏洞)

    Spring Framework遠程代碼執(zhí)行漏洞分析(最新漏洞)

    Spring Framework 是一個開源應用框架,旨在降低應用程序開發(fā)的復雜度,它具有分層體系結構,允許用戶選擇組件,同時還為 J2EE 應用程序開發(fā)提供了一個有凝聚力的框架,對Spring遠程代碼執(zhí)行漏洞相關知識感興趣的朋友一起看看吧
    2022-04-04
  • RabbitMQ冪等性與優(yōu)先級及惰性詳細全面講解

    RabbitMQ冪等性與優(yōu)先級及惰性詳細全面講解

    關于MQ消費者的冪等性問題,在于MQ的重試機制,因為網(wǎng)絡原因或客戶端延遲消費導致重復消費。使用MQ重試機制需要注意的事項以及如何解決消費者冪等性與優(yōu)先級及惰性問題以下將逐一講解
    2022-11-11
  • 重新認識Java的System.in

    重新認識Java的System.in

    今天小編就為大家分享一篇關于重新認識Java的System.in,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot指標監(jiān)控功能實現(xiàn)

    SpringBoot指標監(jiān)控功能實現(xiàn)

    這篇文章主要介紹了SpringBoot指標監(jiān)控功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Java異常處理中的一些特殊情況舉例

    Java異常處理中的一些特殊情況舉例

    這篇文章主要介紹了Java異常處理中的一些特殊情況舉例,分別是只用try和finally不用catch,以及finally語句不被執(zhí)行的情況,需要的朋友可以參考下
    2015-11-11
  • SpringBoot實現(xiàn)XSS攻擊防御的幾種方式

    SpringBoot實現(xiàn)XSS攻擊防御的幾種方式

    隨著Web應用的普及,網(wǎng)絡安全問題也日益凸顯,跨站腳本攻擊(Cross-Site Scripting,簡稱XSS)是一種常見的Web安全漏洞,本文旨在探討如何在Spring Boot應用程序中有效地防御XSS攻擊,我們將介紹兩種主要的防御手段:注解和過濾器,需要的朋友可以參考下
    2024-07-07
  • Linux系統(tǒng)下更換jdk版本詳細步驟

    Linux系統(tǒng)下更換jdk版本詳細步驟

    隨著Java語言的不斷更新,多個版本的JDK在現(xiàn)在的Linux環(huán)境中都存在,使得不同的開發(fā)人員可以按照自己的需求使用不同的JDK版本,這篇文章主要給大家介紹了關于Linux系統(tǒng)下更換jdk版本的詳細步驟,需要的朋友可以參考下
    2023-12-12
  • 詳解Java8 Collect收集Stream的方法

    詳解Java8 Collect收集Stream的方法

    這篇文章主要介紹了Java8-Collect收集Stream的方法,提到了收集器的作用,連接收集器的方法,需要的朋友可以參考下
    2018-04-04
  • 使用JAVA+Maven+TestNG框架實現(xiàn)超詳細Appium測試安卓真機教程

    使用JAVA+Maven+TestNG框架實現(xiàn)超詳細Appium測試安卓真機教程

    這篇文章主要介紹了使用JAVA+Maven+TestNG框架實現(xiàn)超詳細Appium測試安卓真機教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01

最新評論