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

深入理解Java設(shè)計模式之策略模式

 更新時間:2021年11月07日 15:50:00   作者:一指流砂~  
這篇文章主要介紹了JAVA設(shè)計模式之策略模式的的相關(guān)資料,文中示例代碼非常詳細,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下

一、什么是策略模式

策略模式定義了一系列算法,并將每個算法封裝起來,使他們可以相互替換,且算法的變化不會影響到使用算法的客戶。需要設(shè)計一個接口,為一系列實現(xiàn)類提供統(tǒng)一的方法,多個實現(xiàn)類實現(xiàn)該接口,設(shè)計一個抽象類(可有可無,屬于輔助類),提供輔助函數(shù)。

策略模式定義和封裝了一系列的算法,它們是可以相互替換的,也就是說它們具有共性,而它們的共性就體現(xiàn)在策略接口的行為上,另外為了達到最后一句話的目的,也就是說讓算法獨立于使用它的客戶而獨立變化,我們需要讓客戶端依賴于策略接口。

一種很簡單的解釋,在我們的開發(fā)過程中,經(jīng)常會遇到大量的if...else或者switch...case語句,當(dāng)這些語句在開發(fā)中只是為了起到分流作用,這些分流和業(yè)務(wù)邏輯無關(guān),那么這個時候就可以考慮用策略模式。

二、策略模式的結(jié)構(gòu)

這個模式涉及到三個角色:

上下文環(huán)境(Context)角色:持有一個Strategy的引用。

抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現(xiàn)。此角色給出所有的具體策略類所需的接口。

具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為

三、策略模式的應(yīng)用場景

舉一個例子,商場搞促銷--打8折,滿200送50,滿1000送禮物,這種促銷就是策略。

再舉一個例子,dota里面的戰(zhàn)術(shù),玩命四保一,三偽核體系,推進體系,大招流體系等,這些戰(zhàn)術(shù)都是一種策略。

應(yīng)用場景:

1、 多個類只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。

2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現(xiàn)。

3、 對客戶隱藏具體策略(算法)的實現(xiàn)細節(jié),彼此完全獨立。

四、策略模式的優(yōu)缺點

優(yōu)點:

1、結(jié)構(gòu)清晰,把策略分離成一個個單獨的類「替換了傳統(tǒng)的 if else」2、代碼耦合度降低,安全性提高「各個策略的細節(jié)被屏蔽」

缺點:

1、客戶端必須要知道所有的策略類,否則你不知道該使用那個策略,所以策略模式適用于提前知道所有策略的情況下2、策略類數(shù)量增多(每一個策略類復(fù)用性很小,如果需要增加算法,就只能新增類)五、策略模式和簡單工廠模式的異同

在上篇文章已經(jīng)提過了,傳送地址:深入理解設(shè)計模式(二):簡單工廠模式

六、策略模式的實現(xiàn)

Strategy類,定義所有支持的算法的公共接口

//Strategy類,定義所有支持的算法的公共接口
abstract class Strategy
{
    //算法方法
    public abstract void AlgorithmInterface();
}

oncreteStrategy,封裝了具體的算法或行為,繼承于Strategy

//算法A
    class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法A的實現(xiàn)");
        }
    }
    //算法B
    class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法B的實現(xiàn)");
        }
    }
    //算法C
    class ConcreteStrategyC : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法C的實現(xiàn)");
        }
    }

Context,用一個ConcreteStrategy來配置,維護一個對Strategy對象的引用

//Context,用一個ConcreteStrategy來配置,維護一個對Strategy對象的引用
    class Context
    {
        Strategy Strategy;
        public Context(Strategy Strategy)
        {
            this.Strategy = Strategy;
        }
        //上下文接口
        public void ContextInterface()
        {
            Strategy.AlgorithmInterface();
        }
    }

客戶端代碼

static void Main(string[] args)
        {
            Context Context;

            Context = new Context(new ConcreteStrategyA());
            Context.ContextInterface();

            Context = new Context(new ConcreteStrategyB());
            Context.ContextInterface();

            Context = new Context(new ConcreteStrategyC());
            Context.ContextInterface();

            Console.Read();
        }

七、策略模式和簡單工廠模式的結(jié)合

改造后的Context

class Context
    {
        Strategy Strategy=null;
        public Context(string type)
        {
            switch (type)
            {
                case "A":
                    ConcreteStrategyA A = new ConcreteStrategyA();
                    Strategy = A;
                    break;
                case "B":
                    ConcreteStrategyB B = new ConcreteStrategyB();
                    Strategy = B;
                    break;
                case "C":
                    ConcreteStrategyC C = new ConcreteStrategyC();
                    Strategy = C;
                    break;
            }
        }
        //上下文接口
        public void ContextInterface()
        {
            Strategy.AlgorithmInterface();
        }
    }

改造后的客戶端代碼

static void Main(string[] args)
        {
            Context Context = new Context("這里是相應(yīng)的算法類型字符串");
            Context.ContextInterface();

            Console.Read();
        }

對比下改造前后的區(qū)別不難看出,改造前客戶端需要認識兩個類,Context和ConcreteStrategy。而策略模式和簡單工廠模式結(jié)合后,客戶端只需要認識一個類Context,降低了耦合性。

八、策略枚舉的實現(xiàn)

我們可以使用枚舉在一個類中實現(xiàn)以上所有的功能及三種不同的角色,下面看看怎么通過枚舉來實現(xiàn)策略模式

public enum Calculator 
{    ADD("+") {        
        public int exec(int a, int b) {    
            return a+b;        
        }
    },        
    SUB("-") {        
        public int exec(int a, int b) {        
            return a-b;        
            }    
    };            
    public abstract int exec(int a, int b);        
    //運算符    
    private String value = "";        
    private Calculator(String value)
    {        
        this.value = value;
    }     
    public String getValue() 
    {        
        return value;
    }
}

在枚舉類中,定義的抽象方法就像當(dāng)時之前的接口,每一個枚舉ADD SUB相當(dāng)是一個具體的實現(xiàn)類(策略角色),而整個枚舉類就是策略的分裝角色。

這是從網(wǎng)上copy的代碼,本人不怎么喜歡這么寫,總感覺違背了代碼規(guī)范。

九、總結(jié)

策略模式,實質(zhì)就是封裝了一些算法,讓算法可以互相替換,用戶可以自由選擇這些算法進行操作。策略模式本身理解起來沒什么難點,但是在實際應(yīng)用中其本身主要結(jié)合工廠模式一起使用。

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

  • SpringBoot整合Netty的流程步驟

    SpringBoot整合Netty的流程步驟

    Netty是一個基于Java的開源網(wǎng)絡(luò)應(yīng)用框架,它提供了高性能、異步事件驅(qū)動的網(wǎng)絡(luò)編程能力,Netty旨在幫助開發(fā)者構(gòu)建高性能、高可靠性的網(wǎng)絡(luò)應(yīng)用程序,本文給大家詳細介紹了SpringBoot整合Netty的流程步驟,需要的朋友可以參考下
    2023-09-09
  • 初次使用IDEA創(chuàng)建maven項目的教程

    初次使用IDEA創(chuàng)建maven項目的教程

    這篇文章主要介紹了初次使用IDEA創(chuàng)建maven項目的教程講解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java 高并發(fā)九:鎖的優(yōu)化和注意事項詳解

    Java 高并發(fā)九:鎖的優(yōu)化和注意事項詳解

    本文主要介紹Java高并發(fā)鎖的優(yōu)化和注意事項,這里整理了詳細的資料,并講解了 1. 鎖優(yōu)化的思路和方法 2. 虛擬機內(nèi)的鎖優(yōu)化 3. 一個錯誤使用鎖的案例 4. ThreadLocal及其源碼分析等知識,有需要的小伙伴可以參考下
    2016-09-09
  • Java設(shè)計模式以虹貓藍兔的故事講解裝飾器模式

    Java設(shè)計模式以虹貓藍兔的故事講解裝飾器模式

    裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關(guān)系的一種替代方案,本篇文章以虹貓藍兔生動形象的為你帶來詳細講解
    2022-04-04
  • 淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因

    淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因

    這篇文章主要介紹了淺談spring-boot的單元測試中,@Before不被執(zhí)行的原因,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • java布局管理之CardLayout簡單實例

    java布局管理之CardLayout簡單實例

    這篇文章主要為大家詳細介紹了java布局管理之CardLayout的簡單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring中的AOP原理與使用詳解

    Spring中的AOP原理與使用詳解

    這篇文章主要介紹了Spring中的AOP原理與使用詳解,AOP意為面向切面編程,可以通過預(yù)編譯方式或運行期動態(tài)代理實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的一種技術(shù),需要的朋友可以參考下
    2023-12-12
  • 一名Java高級工程師需要學(xué)什么?

    一名Java高級工程師需要學(xué)什么?

    作為一名Java高級工程師需要學(xué)什么?如何成為一名合格的工程師,這篇文章給了你較為詳細的答案,需要的朋友可以參考下
    2017-08-08
  • Servlet簡單實現(xiàn)登錄功能

    Servlet簡單實現(xiàn)登錄功能

    這篇文章主要為大家詳細介紹了Servlet簡單實現(xiàn)登錄功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 最新評論

    永仁县| 盐城市| 台东县| 河间市| 莒南县| 安义县| 葫芦岛市| 崇仁县| 南投市| 金寨县| 平顶山市| 临澧县| 北安市| 错那县| 赤壁市| 海城市| 易门县| 南召县| 游戏| 延长县| 滕州市| 冀州市| 云阳县| 报价| 博爱县| 汉源县| 莱西市| 明星| 吉首市| 道真| 赞皇县| 沂南县| 泸水县| 普兰店市| 宜丰县| 黄大仙区| 民县| 称多县| 文登市| 沂源县| 茶陵县|