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

深入了解Java行為型設(shè)計(jì)模式之策略模式

 更新時(shí)間:2022年09月21日 14:53:35   作者:丨Jack_Chen丨  
策略模式屬于Java-設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下

策略模式

策略模式(Strategy Pattern)也叫政策模式(Policy Pattern),屬于行為型模式。

它是將定義的一系列算法、分別封裝起來,讓它們之間可以互相替換,從而讓算法的變化不會(huì)影響到使用算法的用戶。

策略模式能讓你定義一系列算法, 并將每種算法分別放入獨(dú)立的類中, 以使算法的對象能夠相互替換。

應(yīng)用場景

1、針對同一類型問題,有多種處理方式,每一種都能獨(dú)立解決問題。

2、算法需要自由切換的場景。

3、需要屏蔽算法規(guī)則的場景。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

1.可以在運(yùn)行時(shí)切換對象內(nèi)的算法。

2.避免使用多重條件轉(zhuǎn)移語句,如if.else.語句、switch語句

3.使用策略模式可以提高算法的保密性和安全性。

4.可以將算法的實(shí)現(xiàn)和使用算法的代碼隔離開來。

缺點(diǎn):

1.客戶端必須知道所有的策略,所有策略類都需要對外暴露,并且自行決定使用哪一個(gè)策略類。

2.代碼中會(huì)產(chǎn)生非常多策略類,增加維護(hù)難度。

主要角色

1.抽象策略角色(Strategy)

規(guī)定策略或算法的行為。

2.具體策略角色(ConcreteStrategy)

具體的策略或算法實(shí)現(xiàn)。

3.上下文角色(Context)

用來操作策略的上下文環(huán)境,屏蔽高層模塊(客戶瑞)對策略,算法的直接訪問,封裝可能存在的變化。

策略模式的基本使用

創(chuàng)建抽象策略角色

public interface IStrategy {
    /**
     * 算法、策略
     */
    void algorithm();
}

創(chuàng)建具體策略角色

public class ConcreteStrategyA implements IStrategy {
    public void algorithm() {
        System.out.println("Strategy A 打9折");
    }
}
public class ConcreteStrategyB implements IStrategy {
    public void algorithm() {
        System.out.println("Strategy B 打8折");
    }
}

創(chuàng)建上下文角色

public class Context {
    private IStrategy mStrategy;
    public Context(IStrategy strategy) {
        this.mStrategy = strategy;
    }
    public void algorithm() {
        this.mStrategy.algorithm();
    }
}

客戶端執(zhí)行

    public static void main(String[] args) {
        // 創(chuàng)建具體策略
        IStrategy strategyA = new ConcreteStrategyA();
        IStrategy strategyB = new ConcreteStrategyB();
        // 創(chuàng)建上下文環(huán)境
        Context contextA = new Context(strategyA);
        Context contextB = new Context(strategyB);
        //客戶端直接讓上下文環(huán)境執(zhí)行算法
        contextA.algorithm();
        contextB.algorithm();
    }

Strategy A 打9折
Strategy B 打8折

策略模式實(shí)現(xiàn)支付方式的選擇

創(chuàng)建抽象策略角色

創(chuàng)建支付抽象類,定義支付邏輯

public abstract class Payment {
    /**
     * 支付類型
     */
    public abstract String getName();
    /**
     * 支付
     * @param uid 用戶id
     * @param amount 金額
     * @return 支付結(jié)果
     */
    public String pay(String uid, double amount){
        if(queryBalance(uid) < amount){
            return "支付失敗,"+"商品金額:"+amount+" ,用戶余額:"+queryBalance(uid);
        }
        return "支付成功,"+"商品金額:"+amount+" ,用戶余額:"+(queryBalance(uid)-amount);
    }
    /**
     * 余額查詢
     * @param uid 用戶id
     * @return 余額
     */
    protected abstract double queryBalance(String uid);
}

創(chuàng)建具體策略角色

創(chuàng)建具體支付方式,如AliPay 、WechatPay 、UnionPay等三種方式。

public class AliPay extends Payment {
    public String getName() {
        return "支付寶";
    }
    protected double queryBalance(String uid) {
        return 500;
    }
}
public class WechatPay extends Payment {
    public String getName() {
        return "微信支付";
    }
    protected double queryBalance(String uid) {
        return 600;
    }
}
public class UnionPay extends Payment {
    public String getName() {
        return "銀聯(lián)支付";
    }
    protected double queryBalance(String uid) {
        return 800;
    }
}

創(chuàng)建上下文角色

創(chuàng)建上下文角色,

public class PayStrategy {
    public static final String ALI_PAY = "AliPay";
    public static final String WECHAT_PAY = "WechatPay";
    public static final String UNION_PAY = "UnionPay";
    public static final String DEFAULT_PAY = ALI_PAY;
    private static Map<String, Payment> strategy = new HashMap<String, Payment>();
    static {
        strategy.put(ALI_PAY, new AliPay());
        strategy.put(WECHAT_PAY, new WechatPay());
        strategy.put(UNION_PAY, new UnionPay());
    }
    public static Payment get(String payKey) {
        if (!strategy.containsKey(payKey)) {
            return strategy.get(DEFAULT_PAY);
        }
        return strategy.get(payKey);
    }
}

客戶端執(zhí)行

public class Order {
    private String uid;
    private String name;
    private double price;
    public Order(String uid, String name, double price) {
        this.uid = uid;
        this.name = name;
        this.price = price;
    }
    public String pay() {
        return pay(PayStrategy.DEFAULT_PAY);
    }
    public String pay(String payKey) {
        Payment payment = PayStrategy.get(payKey);
        System.out.println("購買:"+name+" ,使用" + payment.getName() + "支付, " + "支付金額為: " + price);
        return payment.pay(uid, price);
    }
}
    public static void main(String[] args) {
        Order order = new Order("001","皮皮蝦",500.5);
        System.out.println(order.pay());
        System.out.println("----------------------------------------------------");
        System.out.println(order.pay(PayStrategy.WECHAT_PAY));
    }

購買:皮皮蝦 ,使用支付寶支付, 支付金額為: 500.5
支付失敗,商品金額:500.5 ,用戶余額:500.0
----------------------------------------------------
購買:皮皮蝦 ,使用微信支付支付, 支付金額為: 500.5
支付成功,商品金額:500.5 ,用戶余額:99.5

到此這篇關(guān)于深入了解Java行為型設(shè)計(jì)模式之策略模式的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的Calendar日歷API用法完全解析

    Java中的Calendar日歷API用法完全解析

    今天特別整理了針對Java中的Calendar日歷API用法完全解析,通過Calendar API我們可以對Calendar所提供的時(shí)間日期字段進(jìn)行各種自定義操作,首先還是從Calendar的基礎(chǔ)入手:
    2016-06-06
  • Java注解處理器簡單實(shí)例

    Java注解處理器簡單實(shí)例

    這篇文章主要介紹了Java注解處理器簡單實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java線程休眠_(dá)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java線程休眠_(dá)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    sleep() 的作用是讓當(dāng)前線程休眠,即當(dāng)前線程會(huì)從“運(yùn)行狀態(tài)”進(jìn)入到“休眠(阻塞)狀態(tài)”。下面通過實(shí)例代碼給大家介紹Java線程休眠的知識(shí),需要的朋友參考下吧
    2017-05-05
  • 使用Java實(shí)現(xiàn)讀取手機(jī)文件名稱

    使用Java實(shí)現(xiàn)讀取手機(jī)文件名稱

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)讀取手機(jī)文件名稱,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java初始化塊及執(zhí)行過程解析

    Java初始化塊及執(zhí)行過程解析

    這篇文章主要介紹了Java初始化塊及執(zhí)行過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • java 相交鏈表的實(shí)現(xiàn)示例

    java 相交鏈表的實(shí)現(xiàn)示例

    本文主要介紹了java 相交鏈表的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載操作方法

    SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載操作方法

    Spring Boot是一種流行的Java開發(fā)框架,它提供了許多方便的功能來簡化應(yīng)用程序的開發(fā)和部署,這篇文章主要介紹了SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載,需要的朋友可以參考下
    2023-09-09
  • Java中如何獲取當(dāng)前服務(wù)器的IP地址

    Java中如何獲取當(dāng)前服務(wù)器的IP地址

    這篇文章主要給大家介紹了關(guān)于Java中如何獲取當(dāng)前服務(wù)器的IP地址的相關(guān)資料,我們可以使用Java中的InetAddress類來獲取Linux服務(wù)器的IP地址,需要的朋友可以參考下
    2023-07-07
  • java中的匿名內(nèi)部類總結(jié)

    java中的匿名內(nèi)部類總結(jié)

    這篇文章主要介紹了 java中的匿名內(nèi)部類總結(jié)的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java使用POI實(shí)現(xiàn)導(dǎo)出Excel的方法詳解

    Java使用POI實(shí)現(xiàn)導(dǎo)出Excel的方法詳解

    在項(xiàng)目開發(fā)中往往需要使用到Excel的導(dǎo)入和導(dǎo)出,導(dǎo)入就是從Excel中導(dǎo)入到DB中,而導(dǎo)出就是從DB中查詢數(shù)據(jù)然后使用POI寫到Excel上。本文將利用POI實(shí)現(xiàn)導(dǎo)出Excel,需要的可以參考一下
    2022-10-10

最新評論

东台市| 驻马店市| 双城市| 临安市| 衡阳市| 松滋市| 双桥区| 宁明县| 井冈山市| 北流市| 鹿泉市| 潮州市| 卓尼县| 微山县| 炉霍县| 宁津县| 安阳县| 花垣县| 庆安县| 巩义市| 奉化市| 石门县| 鹿邑县| 教育| 墨江| 得荣县| 天津市| 绵阳市| 灵石县| 嘉荫县| 资中县| 普兰县| 舟曲县| 崇左市| 堆龙德庆县| 盱眙县| 麻江县| 湘潭市| 桦甸市| 珠海市| 新密市|