成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設(shè)計模式之策略模式

shixinzhang / 3079人閱讀

摘要:我就不打算再學(xué)下去,我要繼續(xù)學(xué)策略模式,指導(dǎo)能簡單地解釋它。策略模式定義定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。

前言

愛因斯坦說過這樣一句話:如果你不能簡單地解釋一樣?xùn)|西,說明你沒真正理解它。(ps:如果愛因斯坦沒說過,那可能是魯迅說的......)所以,我寫不出這篇文章。我就不打算再學(xué)下去,我要繼續(xù)學(xué)策略模式,指導(dǎo)能簡單地解釋它。

策略模式定義

定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶

例子

假如現(xiàn)在要做一款鴨子應(yīng)用,作為一個OO程序員,這可不是一件難事。設(shè)計一個鴨子超類,再讓它有"呱呱"叫、游泳的方法。

public class Duck{
    public void quck(){ // some code }
    public void swim(){ // some code }
    //other function...
} 

然后讓什么可達鴨、唐老鴨去繼承超類。接著我們要做一件有趣的事,讓鴨子會飛。在Duck類上加 fly() 方法。但是可怕的問題發(fā)生了......所有鴨子會飛了,包括"橡皮鴨"也在飛,而且誘餌鴨不會叫也不會飛。這可不是我們希望看到的。

利用接口如何?

把"飛"、"呱呱叫"分離出來分別做成Flyable接口跟Quackable接口。但是java接口不具有實現(xiàn)代碼的功能。難道還要給每個角色都去實現(xiàn)飛的功能,這樣做就沒有使代碼達到"復(fù)用"的效果。

該怎么做呢?!

先讓我們回顧下‘策略’的定義 ,“...讓算法的變化獨立于使用算法的客戶”。我們把"飛"啊、"呱呱叫"啊獨立開來,只留下不需要變化的。做成一些行為接口,然后讓Duck類用過行為類的類型。

public interface FlyBehavior{
    fly();
}

//會飛的行為類
public class FlyWithWings implements FlyBehavior ()
{
    public void fly()
    {
        System.out.println("i can flying...");
    }
}

//不會飛的行為類
public class FlyNoWay  implements FlyBehavior ()
{
    public void fly()
    {
       //nothing to do,can"t fly
    }
}
public interface QuckBehavior{
    quack();
}

//呱呱叫行為類
public class Quack
{
    //實現(xiàn)呱呱叫
}

public class Squeak
{
    //橡皮鴨吱吱叫
}

//不會叫的...

現(xiàn)在我們將飛、叫delegate(委托)別人處理,而不是定義在Duck類中或者子類中。接著我們整理下代碼。

public abstract class Duck
{
    FlyBehavior flyBehavior;
    QuckBehavior quckBehavior;
    
    public void performFly()
    {
        flyBehavior.fly();
    }
    
    public void performQuck()
    {
        quckBehavior.quack();
    }
}
寫在后面的

讓我們再次回歸定義,“定義了算法族,分別封裝起來”,在這個例子中就是飛的行為、叫的行為?!白屗惴ǖ淖兓毩⒂谑褂盟惴ǖ目蛻簟?,客戶需要一個會飛的鴨子就實現(xiàn)飛接口再實現(xiàn)飛的方法。需要叫就同理,這樣去獨立于使用算法。

我寫得哪里不好,請大神說出來,我會改正的。

 

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67975.html

相關(guān)文章

  • PHP面試常考設(shè)計模式——策略模式

    摘要:策略模式介紹策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。使用策略模式的好處策略模式提供了管理相關(guān)的算法族的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試??贾O(shè)計模式——工...

    Drinkey 評論0 收藏0
  • JavaScript設(shè)計模式策略模式

    摘要:設(shè)計模式與開發(fā)實踐讀書筆記。策略模式可以有效避免多重條件選擇語句。當(dāng)然,策略模式也有一些缺點增加了許多策略類或者策略對象。要使用策略模式,必須了解所有的,違反了最少知識原則。至此,回家咯附設(shè)計模式之發(fā)布訂閱模式觀察者模式 《JavaScript設(shè)計模式與開發(fā)實踐》讀書筆記。這本書挺好的,推薦。 俗話說,條條大路通羅馬。在現(xiàn)實生活中,我們可以采用很多方法實現(xiàn)同一個目標(biāo)。比如我們先定個小目...

    go4it 評論0 收藏0
  • 設(shè)計模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計模式,指對象有某個行爲(wèi),但是在不同的場景中,該行爲(wèi)有不同的實現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時,對提交的任務(wù)做處理就使用了策略模式。以前完整的看過《大話設(shè)計模式》,雖然完整看過,也做過筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時間趁著離職,有時間,打算重新過一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    番茄西紅柿 評論0 收藏0
  • 設(shè)計模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計模式,指對象有某個行爲(wèi),但是在不同的場景中,該行爲(wèi)有不同的實現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時,對提交的任務(wù)做處理就使用了策略模式。以前完整的看過《大話設(shè)計模式》,雖然完整看過,也做過筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時間趁著離職,有時間,打算重新過一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    番茄西紅柿 評論0 收藏0
  • 設(shè)計模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計模式,指對象有某個行爲(wèi),但是在不同的場景中,該行爲(wèi)有不同的實現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時,對提交的任務(wù)做處理就使用了策略模式。以前完整的看過《大話設(shè)計模式》,雖然完整看過,也做過筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時間趁著離職,有時間,打算重新過一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    MangoGoing 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<