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

設(shè)計模式-策略模式 Strategy

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

該模式最常見的應(yīng)用場景是,利用它來避免冗長的 if-else 或 switch 分支判斷。不過,它的作用還不止如此。它也可以像模板模式那樣,提供框架的擴展點等等。

1) 原理和實現(xiàn)

策略模式,英文全稱是 Strategy Design Pattern。該模式是這樣定義的:

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it。

翻譯成中文就是:定義一族算法類,將每個算法分別封裝起來,讓它們可以互相替換。策略模式可以使算法的變化獨立于使用它們的客戶端(這里的客戶端代指使用算法的代碼)。

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

  1. 策略接口(Strategy):定義所有支持的算法的公共接口。客戶端使用這個接口與具體策略進行交互。
  2. 具體策略(Concrete Strategy):實現(xiàn)策略接口的具體策略類。這些類封裝了實際的算法邏輯。
  3. 上下文(Context):持有一個策略對象,用于與客戶端進行交互。上下文可以定義一些接口,讓客戶端不直接與策略接口交互,從而實現(xiàn)策略的封裝。

讓我們以一個簡單的例子來說明策略模式:假設(shè)我們要實現(xiàn)一個計算器,支持加法、減法和乘法運算。我們可以使用策略模式將各種運算獨立為不同的策略,并讓客戶端根據(jù)需要選擇和使用不同的策略。

首先,定義一個策略接口Operation

public interface Operation {
    double execute(double num1, double num2);
}

接下來,創(chuàng)建具體策略類來實現(xiàn)加法、減法和乘法運算:

public class Addition implements Operation {
    @Override
    public double execute(double num1, double num2) {
        return num1 + num2;
    }
}

public class Subtraction implements Operation {
    @Override
    public double execute(double num1, double num2) {
        return num1 - num2;
    }
}

public class Multiplication implements Operation {
    @Override
    public double execute(double num1, double num2) {
        return num1 * num2;
    }
}

然后,創(chuàng)建一個上下文類Calculator,讓客戶端可以使用這個類來執(zhí)行不同的運算:

public class Calculator {
    // 客戶端可以持有一個算法
    private Operation operation;

    public void setOperation(Operation operation) {
        this.operation = operation;
    }

    public double calculate(double num1, double num2) {
        return operation.execute(num1, num2);
    }
}

現(xiàn)在,客戶端可以使用Calculator類來執(zhí)行不同的運算,例如:

public class Client {
    public static void main(String[] args) {
        // 定義一個調(diào)用方
        Calculator calculator = new Calculator();

        // 計算加法
        Operation operation = new Addition();
        calculator.setOperation(operation);
        double calculate = calculator.calculate(10, 12.9);
        System.out.println("calculate = " + calculate);

        // 計算減法
        operation = new Subtraction();
        calculator.setOperation(operation);
        calculate = calculator.calculate(10, 12.9);
        System.out.println("calculate = " + calculate);
    }
}

在這個例子中,我們使用策略模式將加法、減法和乘法運算獨立為不同的策略。客戶端可以根據(jù)需要選擇和使用不同的策略。Calculator上下文類持有一個Operation策略對象,并通過setOperation方法允許客戶端設(shè)置所需的策略。這種方式使得算法的選擇和執(zhí)行更加靈活,易于擴展和維護。

策略模式的優(yōu)點包括:

  1. 提高代碼的可維護性和可擴展性。當需要添加新的算法時,我們只需要實現(xiàn)一個新的具體策略類,而無需修改客戶端代碼。
  2. 符合開閉原則。策略模式允許我們在不修改現(xiàn)有代碼的情況下引入新的策略。
  3. 避免使用多重條件判斷。使用策略模式可以消除一些復雜的條件判斷語句,使代碼更加清晰和易于理解。

策略模式的缺點包括:

  1. 客戶端需要了解所有的策略。為了選擇合適的策略,客戶端需要了解不同策略之間的區(qū)別。
  2. 增加了類的數(shù)量。策略模式會導致程序中具體策略類的數(shù)量增加,這可能會導致代碼的復雜性增加。

在實際開發(fā)中,我們可以根據(jù)業(yè)務(wù)需求和系統(tǒng)架構(gòu)靈活地運用策略模式。例如,在電商系統(tǒng)中,我們可以使用策略模式處理不同的促銷策略;在游戲系統(tǒng)中,我們可以使用策略模式處理不同的角色行為等。

1、策略的定義

策略類的定義比較簡單,包含一個策略接口和一組實現(xiàn)這個接口的策略類。因為所有的策略類都實現(xiàn)相同的接口,所以,客戶端代碼基于接口而非實現(xiàn)編程,可以靈活地替換不同的策略。示例代碼如下所示:

public interface Strategy {
    void algorithmInterface();
}
public class ConcreteStrategyA implements Strategy {
    @Override
    public void  algorithmInterface() {
        //具體的算法...
    }
}
public class ConcreteStrategyB implements Strategy {
    @Override
    public void  algorithmInterface() {
        //具體的算法...
    }
}

2、策略的創(chuàng)建

因為策略模式會包含一組策略,在使用它們的時候,一般會通過類型(type)來判斷創(chuàng)建哪個策略來使用。為了封裝創(chuàng)建邏輯,我們需要對客戶端代碼屏蔽創(chuàng)建細節(jié)。

事實上我們可以做一定的優(yōu)化,可以把根據(jù) type 創(chuàng)建策略的邏輯抽離出來,放到工廠類中。示例代碼如下所示:

public class StrategyFactory {
    private static final Map<String, Strategy> strategies = new HashMap<>();
    static {
        strategies.put("A", new ConcreteStrategyA());
        strategies.put("B", new ConcreteStrategyB());
    }
    public static Strategy getStrategy(String type) {
        if (type == null || type.isEmpty()) {
            throw new IllegalArgumentException("type should not be empty.");
        }
        return strategies.get(type);
    }
}

一般來講,如果策略類是無狀態(tài)的,不包含成員變量,只是純粹的算法實現(xiàn),這樣的策略對象是可以被共享使用的,不需要在每次調(diào)用 getStrategy() 的時候,都創(chuàng)建一個新的策略對象。針對這種情況,我們可以使用上面這種工廠類的實現(xiàn)方式,事先創(chuàng)建好每個策略對象,緩存到工廠類中,用的時候直接返回。

相反,如果策略類是有狀態(tài)的,根據(jù)業(yè)務(wù)場景的需要,我們希望每次從工廠方法中,獲得的都是新創(chuàng)建的策略對象,而不是緩存好可共享的策略對象,那我們就需要按照如下方式來實現(xiàn)策略工廠類。

public class StrategyFactory {
    public static Strategy getStrategy(String type) {
        if (type == null || type.isEmpty()) {
            throw new IllegalArgumentException("type should not be empty.");
        }
        if (type.equals("A")) {
            return new ConcreteStrategyA();
        } else if (type.equals("B")) {
            return new ConcreteStrategyB();
        }
        return null;
    }
}

3、策略的使用

剛剛講了策略的定義和創(chuàng)建,現(xiàn)在,我們再來看一下,策略的使用。

我們知道,策略模式包含一組可選策略,客戶端代碼一般如何確定使用哪個策略呢?最常見的是運行時動態(tài)確定使用哪種策略,這也是策略模式最典型的應(yīng)用場景。

這里的“運行時動態(tài)”指的是,我們事先并不知道會使用哪個策略,而是在程序運行期間,根據(jù)配置、用戶輸入、計算結(jié)果等這些不確定因素,動態(tài)決定使用哪種策略。接下來,我們通過一個例子來解釋一下。

// 策略接口:EvictionStrategy
// 策略類:LruEvictionStrategy、FifoEvictionStrategy、LfuEvictionStrategy...
// 策略工廠:EvictionStrategyFactory
public class UserCache {
    private Map<String, User> cacheData = new HashMap<>();
    private EvictionStrategy eviction;
    public UserCache(EvictionStrategy eviction) {
        this.eviction = eviction;
    }
    //...
}
// 運行時動態(tài)確定,根據(jù)配置文件的配置決定使用哪種策略
public class Application {
    public static void main(String[] args) throws Exception {
        EvictionStrategy evictionStrategy = null;
        Properties props = new Properties();
        props.load(new FileInputStream("./config.properties"));
        String type = props.getProperty("eviction_type");
        evictionStrategy = EvictionStrategyFactory.getEvictionStrategy(type);
        UserCache userCache = new UserCache(evictionStrategy);
        //...
    }
}
// 非運行時動態(tài)確定,在代碼中指定使用哪種策略
public class Application {
    public static void main(String[] args) {
        //...
        EvictionStrategy evictionStrategy = new LruEvictionStrategy();
        UserCache userCache = new UserCache(evictionStrategy);
        //...
    }
}

從上面的代碼中,我們也可以看出,“非運行時動態(tài)確定”,也就是第二個 Application 中的使用方式,并不能發(fā)揮策略模式的優(yōu)勢。在這種應(yīng)用場景下,策略模式實際上退化成了“面向?qū)ο蟮亩鄳B(tài)特性”或“基于接口而非實現(xiàn)編程原則”,這其實就是開篇時列舉的例子的場景。文章來源地址http://www.zghlxwxcb.cn/news/detail-828205.html

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

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

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

相關(guān)文章

  • 【設(shè)計模式-02】Strategy策略模式及應(yīng)用場景

    Java 官方文檔 Overview (Java SE 18 JDK 18) module index https://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 JDK 18) declaration: module: java.base, package: java.util, interface: Comparator https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Compar

    2024年01月16日
    瀏覽(22)
  • 【設(shè)計模式-03】Strategy策略模式及應(yīng)用場景

    【設(shè)計模式-03】Strategy策略模式及應(yīng)用場景

    Java 官方文檔 Overview (Java SE 18 JDK 18) module index https://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 JDK 18) declaration: module: java.base, package: java.util, interface: Comparator https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Compar

    2024年01月22日
    瀏覽(24)
  • C++設(shè)計模式_04_Strategy 策略模式

    接上篇,本篇將會介紹C++設(shè)計模式中的 Strategy 策略模式 ,和上篇 模板方法Template Method 一樣,仍屬于“組件協(xié)作”模式,它與Template Method有著異曲同工之妙。 在軟件構(gòu)建過程中,某些對象使用的算法可能多種多樣?

    2024年02月09日
    瀏覽(18)
  • 設(shè)計模式二十二:策略模式(Strategy Pattern)

    定義一系列算法,將每個算法封裝成獨立的對象,并使這些對象可互相替換。這使得在運行時可以動態(tài)地選擇算法,而不必改變使用算法的客戶端代碼。策略模式的主要目標是將算法的定義與使用分離,使得客戶端可以根據(jù)需要靈活地選擇和切換不同的算法,而不影響到客戶

    2024年02月11日
    瀏覽(19)
  • java設(shè)計模式---策略模式

    java設(shè)計模式---策略模式

    策略設(shè)計模式是一種行為設(shè)計模式。當在處理一個業(yè)務(wù)時,有多種處理方式,并且需要再運行時決定使哪一種具體實現(xiàn)時,就會使用策略模式。 策略模式的類圖: 在支付業(yè)務(wù)中,有三種付款方式,程序運行時使用哪種方式由用戶選擇,根據(jù)用戶選擇執(zhí)行不同的邏輯。 首先,

    2024年02月10日
    瀏覽(18)
  • Java設(shè)計模式——策略模式

    Java設(shè)計模式——策略模式

    1. 策略模式簡介 策略模式: 策略模式是一種行為型模式, 它將對象和行為分開, 將行為定義為一個行為接口和具體行為的實現(xiàn) 策略模式最大的特點是行為的變化, 行為之間可以相互替換 每個if判斷都可以理解為一個策略. 本模式是的算法可獨立于使用它的用戶而變化 2. 模式結(jié)構(gòu)

    2024年02月11日
    瀏覽(34)
  • Java設(shè)計模式之策略模式詳解

    大家好,我是免費搭建查券返利機器人賺傭金就用微賺淘客系統(tǒng)3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天,讓我們一同踏入Java設(shè)計模式之策略模式的世界,探討代碼中的智慧抉擇。 策略模式的核心思想 策略模式是一種行為型設(shè)計模式,它定義了算法家族

    2024年01月20日
    瀏覽(28)
  • Java特性之設(shè)計模式【策略模式】

    Java特性之設(shè)計模式【策略模式】

    概述 在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設(shè)計模式屬于行為型模式 在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執(zhí)行算法 主要解決 :在有多種

    2024年02月08日
    瀏覽(32)
  • Java設(shè)計模式——策略

    前言 策略模式是平時Java開發(fā)中常用的一種,雖然已有很多講解設(shè)計模式的文章,但是這里還是寫篇文章來從自己理解的角度講解一下。 我們不妨進行場景假設(shè),要對我們的軟件進行授權(quán)管理:在啟動我們的軟件之前先要校驗是否存在合法的授權(quán),如果授權(quán)不合法則要求用戶

    2024年02月20日
    瀏覽(19)
  • Java設(shè)計模式-策略模式-基于Spring實現(xiàn)

    Java設(shè)計模式-策略模式-基于Spring實現(xiàn)

    策略模式是一種行為設(shè)計模式,它允許在運行時選擇算法的行為。它將算法封裝在 獨立的策略類 中,使得它們可以相互替換,而不影響客戶端代碼。這種模式通過 將算法的選擇從客戶端代碼中分離出來 ,提供了更大的靈活性和可維護性。 在Java中,策略模式的設(shè)計理念可以

    2024年02月08日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包