国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【設(shè)計模式 行為型】策略模式

這篇具有很好參考價值的文章主要介紹了【設(shè)計模式 行為型】策略模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

它允許在運行時根據(jù)需要選擇算法的行為。該模式通過將算法封裝成獨立的類,使得它們可以相互替換,而不影響使用算法的客戶端代碼。

策略模式主要包含以下角色:

  1. 環(huán)境(Context):環(huán)境對象持有一個策略對象的引用,它提供了一個接口用于執(zhí)行具體的算法。
  2. 抽象策略(Strategy):定義了策略類的統(tǒng)一接口,用于約束具體策略類的行為。
  3. 具體策略(Concrete Strategy):實現(xiàn)了抽象策略定義的接口,具體實現(xiàn)算法邏輯。

下面以一個簡單的支付系統(tǒng)為例來說明策略模式的應(yīng)用:

// 抽象策略類
public interface PaymentStrategy {
    void pay(double amount);
}

// 具體策略類
public class AliPayStrategy implements PaymentStrategy {
    public void pay(double amount) {
        System.out.println("使用支付寶支付:" + amount + "元");
        // 具體的支付邏輯
    }
}

public class WeChatPayStrategy implements PaymentStrategy {
    public void pay(double amount) {
        System.out.println("使用微信支付:" + amount + "元");
        // 具體的支付邏輯
    }
}

// 環(huán)境類
@Data
@NoArgsConstructor
public class PaymentContext {
    private PaymentStrategy strategy;

    public void pay(double amount) {
        strategy.pay(amount);
    }
}

在上述示例中,我們定義了一個抽象策略類PaymentStrategy,并有兩個具體的策略類AliPayStrategyWeChatPayStrategy分別實現(xiàn)了支付寶支付和微信支付的具體邏輯。

環(huán)境類PaymentContext持有一個策略對象的引用,并提供了設(shè)置策略和支付方法??蛻舳送ㄟ^設(shè)置不同的策略對象來實現(xiàn)不同的支付方式。這樣,客戶端代碼與具體的支付算法解耦,可以動態(tài)地在運行時切換支付策略。

下面是使用策略模式實現(xiàn)的客戶端代碼:

javaCopy Codepublic class Client {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();

        // 使用支付寶支付
        PaymentStrategy aliPayStrategy = new AliPayStrategy();
        context.setPaymentStrategy(aliPayStrategy);
        context.pay(100.0);

        // 使用微信支付
        PaymentStrategy weChatPayStrategy = new WeChatPayStrategy();
        context.setPaymentStrategy(weChatPayStrategy);
        context.pay(200.0);
    }
}

運行上述客戶端代碼,輸出如下:

Copy Code 使用支付寶支付:100.0 元
使用微信支付:200.0 元

通過策略模式,我們可以輕松地在運行時切換不同的支付方式,而不需要改動客戶端代碼。策略模式將算法的選擇和使用進行了解耦,提高了代碼的靈活性和可維護性。同時,策略模式也符合開閉原則,當(dāng)需要新增一種支付方式時,只需要添加新的具體策略類即可,無需修改原有代碼邏輯。

public class Client {
    public static void main(String[] args) {
        double price = 100.0;
        String type = "normal";
        double discount = 1.0;

        // 根據(jù)商品類型設(shè)置折扣率
        if (type.equals("vip")) {
            discount = 0.9;
        } else if (type.equals("member")) {
            discount = 0.95;
        } else if (type.equals("promotion")) {
            discount = 0.8;
        }

        double actualPrice = price * discount;
        System.out.println("商品的實際價格為:" + actualPrice);
    }
}

上述代碼中,我們根據(jù)商品類型手動設(shè)置相應(yīng)的折扣率,然后計算實際價格。這樣的代碼雖然簡單,但存在以下問題:

  1. 客戶端代碼與具體的折扣算法高度耦合,如果需要更改算法,例如新增一種商品類型,就需要修改客戶端代碼,這會導(dǎo)致代碼的可維護性變差。
  2. 沒有遵循開閉原則,當(dāng)需要新增一種商品類型時,就需要修改原有代碼邏輯,這樣會影響到其他代碼的穩(wěn)定性。

因此,采用策略模式能更好地解決這些問題,實現(xiàn)代碼的松耦合和可維護性。

public class CeLue {

    public static void main(String[] args) {
        double price = 100.0;
        String type = "vip";
        PayStrategy conType = getPayStrategy(type);
        PayContext payContext = new PayContext(conType);
        payContext.pay(price);
    }

    private static PayStrategy getPayStrategy(String type) {
        switch (type) {
            case "vip":
                return new VipType();
            default:
                return new NormalType();
        }
    }
}

interface PayStrategy {
    void pay(double amount);
}

class NormalType implements PayStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("普通支付" + amount + "元");
    }
}

class VipType implements PayStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("vip支付" + amount * 0.9 + "元");
    }
}

class PayContext {
    private PayStrategy payStrategy;

    public PayContext(PayStrategy payStrategy) {
        this.payStrategy = payStrategy;
    }

    public void pay(double amount) {
        payStrategy.pay(amount);
    }

}

分享一個案例:統(tǒng)一認證登錄

認證接口類 AuthService

public interface AuthService {

  UserExt execute(AuthParamsDto authParamsDto);

}

它的實現(xiàn)類 可以是密碼登錄PasswordAuthServiceImpl 手機號登錄PhoneAuthServiceImpl 微信登錄WxAuthServiceImpl 等,獲取前綴,拼接bean名稱,Spring上下文拿到bean

調(diào)用,我用的是SpringsSecurity框架并重寫了 UserDetailsService文章來源地址http://www.zghlxwxcb.cn/news/detail-807833.html

    @Autowired
    ApplicationContext applicationContext;

    //傳入的是AuthParamsDto的json串
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        AuthParamsDto authParamsDto = null;
        try {
            //將認證參數(shù)轉(zhuǎn)為AuthParamsDto類型
            authParamsDto = JSON.parseObject(s, AuthParamsDto.class);
        } catch (Exception e) {
            log.info("認證請求不符合項目要求:{}",s);
            throw new RuntimeException("認證請求數(shù)據(jù)格式不對");
        }
        //認證方式
        String authType = authParamsDto.getAuthType();
        //從spring容器中拿具體的認證bean實例
        AuthService authService = applicationContext.getBean(authType + "_authservice", AuthService.class);
        //開始認證,認證成功拿到用戶信息
        XcUserExt xcUserExt = authService.execute(authParamsDto);

        return getUserPrincipal(xcUserExt);
    }
@Data
public class AuthParamsDto {

    private String username; //用戶名
    private String password; //域  用于擴展
    private String cellphone;//手機號
    private String checkcode;//驗證碼
    private String checkcodekey;//驗證碼key
    private String authType; // 認證的類型   password:用戶名密碼模式類型    sms:短信模式類型
    private Map<String, Object> payload = new HashMap<>();//附加數(shù)據(jù),作為擴展,不同認證類型可擁有不同的附加數(shù)據(jù)。如認證類型為短信時包含smsKey : sms:3d21042d054548b08477142bbca95cfa; 所有情況下都包含clientId

}

到了這里,關(guān)于【設(shè)計模式 行為型】策略模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 設(shè)計模式(4)--對象行為(9)--策略

    設(shè)計模式(4)--對象行為(9)--策略

    1. 意圖 ? ? 定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。 ? ? 本模式使得算法可獨立于使用它的客戶而變化。 2. 三種角色 ? ?抽象策略(Strategy)、具體策略(Concrete Strategy)、上下文環(huán)境(Context) 3. 優(yōu)點 ? ? 3.1 可重用的相關(guān)算法系列。 ? ? 3.2 一個替代繼

    2024年02月04日
    瀏覽(21)
  • 軟件設(shè)計模式與體系結(jié)構(gòu)-設(shè)計模式-行為型軟件設(shè)計模式-策略模式

    軟件設(shè)計模式與體系結(jié)構(gòu)-設(shè)計模式-行為型軟件設(shè)計模式-策略模式

    策略模式(Strategy Pattern)是一種行為型設(shè)計模式,它定義了一系列算法,并將每個算法封裝在獨立的類中,使它們可以相互替換。策略模式使得算法可以獨立于使用它們的客戶端而變化。 下面是一個使用策略模式的簡單代碼示例,以解釋其工作原理: 在上述示例中,策略模

    2024年02月13日
    瀏覽(26)
  • 【設(shè)計模式與范式:行為型】61 | 策略模式(下):如何實現(xiàn)一個支持給不同大小文件排序的小程序?

    上一節(jié)課,我們主要介紹了策略模式的原理和實現(xiàn),以及如何利用策略模式來移除 if-else 或者 switch-case 分支判斷邏輯。今天,我們結(jié)合“給文件排序”這樣一個具體的例子,來詳細講一講策略模式的設(shè)計意圖和應(yīng)用場景。 除此之外,在今天的講解中,我還會通過一步一步地

    2024年02月10日
    瀏覽(20)
  • 【十五】設(shè)計模式~~~行為型模式~~~狀態(tài)模式(Java)

    【十五】設(shè)計模式~~~行為型模式~~~狀態(tài)模式(Java)

    【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★☆☆】 在很多情況下,一個對象的行為取決于一個或多個動態(tài)變化的屬性,這樣的屬性叫做狀態(tài),這樣的對象叫做有狀態(tài)的(stateful)對象,這樣的對象狀態(tài)是從事先定義好的一系列值中取出的。當(dāng)一個這樣的對象與外部事件產(chǎn)生互

    2024年02月07日
    瀏覽(17)
  • 【Java 設(shè)計模式】行為型之狀態(tài)模式

    狀態(tài)模式(State Pattern)是一種行為型設(shè)計模式,用于通過將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同的狀態(tài)下具有不同的行為。狀態(tài)模式允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變其行為,而無需修改其代碼。在本文中,我們將深入研究Java中狀態(tài)模式的定義、結(jié)構(gòu)、使

    2024年01月24日
    瀏覽(24)
  • 【Java 設(shè)計模式】行為型之命令模式

    命令模式(Command Pattern)是一種行為型設(shè)計模式,用于將請求封裝為對象,使得可以參數(shù)化客戶端對象,并且能夠排隊、記錄請求,以及支持撤銷操作。在本文中,我們將深入研究Java中命令模式的定義、結(jié)構(gòu)、使用場景以及如何在實際開發(fā)中應(yīng)用。 命令模式是一種行為型設(shè)

    2024年01月23日
    瀏覽(27)
  • 【Java 設(shè)計模式】行為型之責(zé)任鏈模式

    責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計模式,用于將請求發(fā)送者和接收者解耦,使得多個對象都有機會處理請求。責(zé)任鏈模式通過創(chuàng)建一個處理請求的鏈,將請求沿著鏈傳遞,直到有一個對象能夠處理為止。在本文中,我們將深入研究Java中責(zé)任鏈模式的定

    2024年01月24日
    瀏覽(23)
  • 【玩轉(zhuǎn)23種Java設(shè)計模式】行為型模式篇:模板模式

    軟件設(shè)計模式(Design pattern),又稱設(shè)計模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。 匯總目錄鏈接:【玩轉(zhuǎn)23種Java設(shè)計模式】學(xué)習(xí)目錄匯總

    2024年02月16日
    瀏覽(21)
  • 【玩轉(zhuǎn)23種Java設(shè)計模式】行為型模式篇:責(zé)任鏈模式

    軟件設(shè)計模式(Design pattern),又稱設(shè)計模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。 匯總目錄鏈接:【玩轉(zhuǎn)23種Java設(shè)計模式】學(xué)習(xí)目錄匯總

    2024年02月13日
    瀏覽(18)
  • Java設(shè)計模式之行為型-狀態(tài)模式(UML類圖+案例分析)

    Java設(shè)計模式之行為型-狀態(tài)模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計 四、案例分析 五、總結(jié) 狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類,狀態(tài)模式主要解決的是當(dāng)控制一個對象狀態(tài)轉(zhuǎn)換的條件表達式過于復(fù)雜時的情況,把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不

    2024年02月16日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包