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

資訊專欄INFORMATION COLUMN

常用設(shè)計(jì)模式——策略模式

sumory / 1954人閱讀

摘要:策略模式的使用場(chǎng)景針對(duì)同一類型問(wèn)題的多種處理方式,僅僅是具體行為有差別時(shí)需要安全地封裝多種同一類型的操作時(shí)出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用或者來(lái)選擇具體子類時(shí)。抽象策略角色這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。

寫代碼時(shí)總會(huì)出很多的if…else,或者case。如果在一個(gè)條件語(yǔ)句中又包含了多個(gè)條件語(yǔ)句就會(huì)使得代碼變得臃腫,維護(hù)的成本也會(huì)加大,而策略模式就能較好的解決這個(gè)問(wèn)題,本篇博客就帶你詳細(xì)了解策略模式。

策略模式的定義和使用場(chǎng)景

1、定義:策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使他們可以相互替換,讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
分析下定義,策略模式定義和封裝了一系列的算法,它們是可以相互替換的,也就是說(shuō)它們具有共性,而它們的共性就體現(xiàn)在策略接口的行為上,另外為了達(dá)到最后一句話的目的,也就是說(shuō)讓算法獨(dú)立于使用它的客戶而獨(dú)立變化,我們需要讓客戶端依賴于策略接口。

2、策略模式的使用場(chǎng)景:
1.針對(duì)同一類型問(wèn)題的多種處理方式,僅僅是具體行為有差別時(shí);
2.需要安全地封裝多種同一類型的操作時(shí);
3.出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用 if-else 或者 switch-case 來(lái)選擇具體子類時(shí)。

這個(gè)模式涉及到三個(gè)角色:

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

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

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

策略模式的典型代碼如下:
抽象策略類

public interface Strategy {
    /**
     * 策略方法
     */
    public void strategyInterface();
}

具體策略類

public class ConcreteStrategyA implements Strategy {

    @Override
    public void strategyInterface() {
        //相關(guān)的業(yè)務(wù)
    }

}

public class ConcreteStrategyB implements Strategy {

    @Override
    public void strategyInterface() {
        //相關(guān)的業(yè)務(wù)
    }

}

環(huán)境策略類

public class Context {
    //持有一個(gè)具體策略的對(duì)象
    private Strategy strategy;
    /**
     * 構(gòu)造函數(shù),傳入一個(gè)具體策略對(duì)象
     * @param strategy    具體策略對(duì)象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){

        strategy.strategyInterface();
    }

}

實(shí)例:
假設(shè)鵝廠推出了3種會(huì)員,分別為會(huì)員,超級(jí)會(huì)員以及金牌會(huì)員,還有就是普通玩家,針對(duì)不同類別的玩家,購(gòu)買《王者農(nóng)藥》皮膚有不同的打折方式,并且一個(gè)顧客每消費(fèi)10000就增加一個(gè)級(jí)別,那么我們就可以使用策略模式,因?yàn)椴呗阅J矫枋龅木褪撬惴ǖ牟煌@里我們舉例就采用最簡(jiǎn)單的,以上四種玩家分別采用原價(jià)(普通玩家),九折,八折和七價(jià)的收錢方式。

那么我們首先要有一個(gè)計(jì)算價(jià)格的策略接口:

public interface CalPrice {
    //根據(jù)原價(jià)返回一個(gè)最終的價(jià)格
    Double calPrice(Double orgnicPrice);
}

下面是4種玩家的計(jì)算方式的實(shí)現(xiàn):

public class Orgnic implements CalPrice {

    @Override
    public Double calPrice(Double orgnicPrice) {
        return orgnicPrice;
    }
}

public class Vip implements CalPrice {
    @Override
    public Double calPrice(Double orgnicPrice) {
        return orgnicPrice * 0.9;
    }
}

public class SuperVip implements CalPrice {
    @Override
    public Double calPrice(Double orgnicPrice) {
        return orgnicPrice * 0.8;
    }
}

public class GoldVip implements CalPrice {
    @Override
    public Double calPrice(Double orgnicPrice) {
        return orgnicPrice * 0.7;
    }
}

我們看客戶類,我們需要客戶類幫我們完成玩家升級(jí)的功能:

public class Player {
    private Double totalAmount = 0D;//客戶在鵝廠消費(fèi)的總額
    private Double amount = 0D;//客戶單次消費(fèi)金額
    private CalPrice calPrice = new Orgnic();//每個(gè)客戶都有一個(gè)計(jì)算價(jià)格的策略,初始都是普通計(jì)算,即原價(jià)

    //客戶購(gòu)買皮膚,就會(huì)增加它的總額
    public void buy(Double amount) {
        this.amount = amount;
        totalAmount += amount;
        if (totalAmount > 30000) {//30000則改為金牌會(huì)員計(jì)算方式
            calPrice = new GoldVip();
        } else if (totalAmount > 20000) {//類似
            calPrice = new SuperVip();
        } else if (totalAmount > 10000) {//類似
            calPrice = new Vip();
        }
    }

    //計(jì)算客戶最終要付的錢
    public Double calLastAmount() {
        return calPrice.calPrice(amount);
    }
}

接下來(lái)是客戶端調(diào)用,系統(tǒng)會(huì)幫我們自動(dòng)調(diào)整收費(fèi)策略:

public class Client {
    public static void main(String[] args) {
        Player player = new Player();
        player.buy(5000D);
        System.out.println("玩家需要付錢:" + player.calLastAmount());
        player.buy(12000D);
        System.out.println("玩家需要付錢:" + player.calLastAmount());
        player.buy(12000D);
        System.out.println("玩家需要付錢:" + player.calLastAmount());
        player.buy(12000D);
        System.out.println("玩家需要付錢:" + player.calLastAmount());
    }
}

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

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

相關(guān)文章

  • 互聯(lián)網(wǎng)常用設(shè)計(jì)模式——通往架構(gòu)師的第一步

    摘要:設(shè)計(jì)模式的分類經(jīng)典應(yīng)用框架中常見(jiàn)的設(shè)計(jì)模式分為三類創(chuàng)建型模式對(duì)類的實(shí)例化過(guò)程的抽象。對(duì)象的結(jié)構(gòu)模式是動(dòng)態(tài)的。對(duì)象的行為模式則使用對(duì)象的聚合來(lái)分配行為。設(shè)計(jì)模式是個(gè)好東西,以后肯定還要進(jìn)一步的學(xué)習(xí),并且在項(xiàng)目中多實(shí)踐,提升自己的設(shè)計(jì)能力。 什么是設(shè)計(jì)模式? Christopher Alexander?說(shuō)過(guò):每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問(wèn)題,以及該問(wèn)題的解決方案的核心。這樣...

    張紅新 評(píng)論0 收藏0
  • 【JS】常用設(shè)計(jì)模式

    摘要:常用設(shè)計(jì)模式大型單頁(yè)應(yīng)用里,復(fù)雜度上升到一定程度時(shí),沒(méi)有適當(dāng)?shù)脑O(shè)計(jì)模式進(jìn)行降耦,后續(xù)的開(kāi)發(fā)也難以下手。而設(shè)計(jì)模式正是為了降耦而存在。特點(diǎn)滿足單一職責(zé)原則使用代理模式,不在構(gòu)造函數(shù)中判斷是否已經(jīng)創(chuàng)建過(guò)該單例滿足惰性原則應(yīng)用彈出登陸窗口。 JS常用設(shè)計(jì)模式 大型單頁(yè)應(yīng)用里,復(fù)雜度上升到一定程度時(shí),沒(méi)有適當(dāng)?shù)脑O(shè)計(jì)模式進(jìn)行降耦,后續(xù)的開(kāi)發(fā)也難以下手。而設(shè)計(jì)模式正是為了降耦而存在。 單例模式 單...

    VishKozus 評(píng)論0 收藏0
  • 設(shè)計(jì)模式-策略模式

    摘要:在這個(gè)算法類中封裝了大量查找算法,該類代碼將較復(fù)雜,維護(hù)較為困難。換言之,策略模式只適用于客戶端知道算法或行為的情況。策略模式概覽圖參考菜鳥(niǎo)教程策略模式十種常用的設(shè)計(jì)模式大部分自己總結(jié),部分摘抄與模式之策略模式 策略模式 ? 我們都知道商場(chǎng)打折的時(shí)候,會(huì)根據(jù)會(huì)員的等級(jí)情況進(jìn)行不同的折扣優(yōu)惠,如果是VIP會(huì)員,那么可能就是5折優(yōu)惠,如果是一般會(huì)員就是8折優(yōu)惠,如果是普通顧客就是9折...

    Freelander 評(píng)論0 收藏0
  • JavaScript常用設(shè)計(jì)模式

    摘要:前言設(shè)計(jì)模式幾十種,閱讀了設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐這本書后,個(gè)人感覺(jué)就是圍繞對(duì)象來(lái)設(shè)計(jì)的,發(fā)現(xiàn)日常寫代碼能用上的并不多,下面是常用的幾種設(shè)計(jì)模式。前端服務(wù)端可以參考我的另一個(gè)倉(cāng)庫(kù)地址,一個(gè)簡(jiǎn)單的實(shí)時(shí)聊天參考來(lái)自設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書筆記 前言 設(shè)計(jì)模式幾十種,閱讀了《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》這本書后,個(gè)人感覺(jué)js就是圍繞對(duì)象來(lái)設(shè)計(jì)的,發(fā)現(xiàn)日常寫代碼能用上的并不多,下面是常用的...

    mengbo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<