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

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

這篇具有很好參考價(jià)值的文章主要介紹了Java設(shè)計(jì)模式——策略。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

策略模式是平時(shí)Java開發(fā)中常用的一種,雖然已有很多講解設(shè)計(jì)模式的文章,但是這里還是寫篇文章來(lái)從自己理解的角度講解一下。

使用場(chǎng)景

我們不妨進(jìn)行場(chǎng)景假設(shè),要對(duì)我們的軟件進(jìn)行授權(quán)管理:在啟動(dòng)我們的軟件之前先要校驗(yàn)是否存在合法的授權(quán),如果授權(quán)不合法則要求用戶進(jìn)行激活操作。作為例子,我們就簡(jiǎn)單地實(shí)現(xiàn)一下授權(quán)校驗(yàn)功能:分發(fā)的授權(quán)文件中內(nèi)容是一個(gè)四位隨機(jī)數(shù),并且最后一位是數(shù)字且為0。我們只要校驗(yàn)授權(quán)文件中內(nèi)容的最后一位是數(shù)字0即可。

public class LicenseService {
    public boolean checkLicense() {
        boolean result = false;
        // abc0
        File file = Path.of("./secret").toFile();
        String content = "";
        try{
            // 讀取文件內(nèi)容
            BufferedReader br = new BufferedReader(new FileReader(file));
            content = br.readLine();
            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
		// 末尾字符是0即認(rèn)為校驗(yàn)通過(guò)
        if (content.endsWith("0")) {
            result = true;
        }

        return result;
    }
}

需求變更

現(xiàn)在需求進(jìn)行了變更,不再校驗(yàn)?zāi)┪沧址麨?了,而是校驗(yàn)開頭字符是0,因此我們需要對(duì)程序進(jìn)行修改。并且,我們?cè)谡{(diào)整程序的過(guò)程中將讀取文件內(nèi)容和授權(quán)校驗(yàn)的邏輯進(jìn)行分離,將授權(quán)校驗(yàn)的邏輯抽到一個(gè)單獨(dú)的方法中。

public boolean checkLicense() {
        ...

        result = checkInternal(content, result);

        ...
    }

    private static boolean checkInternal(String content, boolean result) {
        if (content.startsWith("0")) {
            result = true;
        }
        return result;
    }

改完之后又接到了最新通知,還有可能改回原來(lái)末尾字符的判斷方式,于是我們又對(duì)方法進(jìn)行了調(diào)整。通過(guò)方法傳入一個(gè)參數(shù)來(lái)決定使用哪種方式判斷:

public boolean checkLicense() {
        ...

        result = checkInternal(content, result, 1);

        ...
    }

    private static boolean checkInternal(String content, boolean result, int choose) {
    	// 通過(guò)方法傳入的choose來(lái)決定使用哪種算法
        if (choose == 0) {
            if (content.endsWith("0")) {
                result = true;
            }
        } else if (choose == 1) {
            if (content.startsWith("0")) {
                result = true;
            }
        }
        return result;
    }

策略模式

上面我們的例子是比較簡(jiǎn)單的,但是達(dá)到了演示的效果:校驗(yàn)授權(quán)的實(shí)現(xiàn)可能有多個(gè)版本,并且不同版本的實(shí)現(xiàn)都有可能被使用。為了后續(xù)方便擴(kuò)展和維護(hù),我們把checkInternal方法中的兩個(gè)if判斷中的邏輯再抽離出來(lái)。

首先定義一個(gè)策略接口:

public interface CheckStrategy {
    boolean check(String content);
}

然后將兩個(gè)if中的邏輯轉(zhuǎn)到接口的實(shí)現(xiàn)類中:

public class CheckStart implements CheckStrategy {
    @Override
    public boolean check(String content) {
        boolean result = false;
        if (content.startsWith("0")) {
            result = true;
        }
        return result;
    }
}
public class CheckEnd implements CheckStrategy {
    @Override
    public boolean check(String content) {
        boolean result = false;
        if (content.endsWith("0")) {
            result = true;
        }
        return result;
    }
}

接下來(lái)再調(diào)整一下LicenseService中方法的調(diào)用,把原來(lái)的checkInternal方法中的if語(yǔ)句進(jìn)行調(diào)整,改為調(diào)用CheckStrategy中的方法:

public boolean checkLicense() {
        ...

        result = checkInternal(content, new CheckStart());

        ...
}

private static boolean checkInternal(String content, CheckStrategy strategy) {
        return strategy.check(content);
}

更多思考

有說(shuō)一種對(duì)于策略的說(shuō)法是替換滿屏的if else,我認(rèn)為這不能算是策略模式的使用目的,只能算是應(yīng)用了策略模式后的副產(chǎn)物。

它更多的使用場(chǎng)景是這樣:有某一大方法,其中的一個(gè)環(huán)節(jié)可以有不同實(shí)現(xiàn),并且進(jìn)行環(huán)節(jié)的算法替換時(shí)不影響原大方法的功能(或受到預(yù)期的控制)。這里再舉一些應(yīng)用場(chǎng)景的例子,不夠精準(zhǔn)但重在體會(huì)其中的思想:

  • 實(shí)現(xiàn)游戲可以用不同的底層引擎,引擎之間的替換可以應(yīng)用策略模式
  • 程序和數(shù)據(jù)庫(kù)交互時(shí)可能用到不同的數(shù)據(jù)庫(kù)產(chǎn)品如mysql、sqllite,對(duì)不同數(shù)據(jù)庫(kù)的交互操作可以應(yīng)用策略模式
  • 別的我暫時(shí)想不起來(lái)了

Spring中實(shí)戰(zhàn)

現(xiàn)在java web應(yīng)用里Spring算是事實(shí)上的標(biāo)準(zhǔn)了,在Spring中用策略模式還是有一些小技巧的。下面直接給出代碼請(qǐng)同學(xué)們品。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-830455.html

@Service
public class LicenseService {
    // 注入strategy manager
    @Autowired
    private StrategyManager strategyManager;

    public boolean checkLicense() {
        boolean result = false;
        // abc0
        File file = Path.of("./secret").toFile();
        String content = "";
        try {
            // 讀取文件內(nèi)容
            BufferedReader br = new BufferedReader(new FileReader(file));
            content = br.readLine();
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 由manager作為策略類實(shí)現(xiàn)的提供者
        result = strategyManager
                .pickCheckStrategy(CheckStrategyEnum.START.toString())
                .check(content);

        return result;
    }
}
@Service
public class StrategyManager {
    // 注入CheckStrategy list
    @Autowired
    private List<CheckStrategy> checkStrategyList;

    public CheckStrategy pickCheckStrategy(String type) {
        // 根據(jù)傳入的type從上面list中取出對(duì)應(yīng)的策略實(shí)現(xiàn)類并返回給調(diào)用者
        return checkStrategyList
                .stream()
                .filter(s -> s.type().equals(type))
                .findFirst()
                .orElseThrow();
    }
}

enum CheckStrategyEnum {
    END, START;
}
public interface CheckStrategy {
    /**
     * 返回策略實(shí)現(xiàn)類的類型,用于為manager提供實(shí)現(xiàn)類的標(biāo)識(shí)
     *
     * @return 自定義的枚舉類型 {@link CheckStrategyEnum}
     */
    String type();

    /**
     * 判斷授權(quán)。算法由實(shí)現(xiàn)類確定
     *
     * @param content 判斷的內(nèi)容
     * @return 是否判斷成功
     */
    boolean check(String content);
}
@Service
public class CheckStart implements CheckStrategy {
    @Override
    public String type() {
        // 返回對(duì)應(yīng)的枚舉type
        return CheckStrategyEnum.END.toString();
    }

    @Override
    public boolean check(String content) {
        boolean result = false;
        if (content.startsWith("0")) {
            result = true;
        }
        return result;
    }
}
@Service
public class CheckEnd implements CheckStrategy {
    @Override
    public String type() {
        // 返回對(duì)應(yīng)的枚舉type
        return CheckStrategyEnum.START.toString();
    }

    @Override
    public boolean check(String content) {
        boolean result = false;
        if (content.endsWith("0")) {
            result = true;
        }
        return result;
    }
}

到了這里,關(guān)于Java設(shè)計(jì)模式——策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Java設(shè)計(jì)模式之策略(Strategy)模式

    策略(Strategy)設(shè)計(jì)模式定義了一系列算法,將它們封裝起來(lái),并且可以相互替換使用,從而使得算法可以獨(dú)立于使用它的客戶而變化。 策略(Strategy)設(shè)計(jì)模式是一種行為型設(shè)計(jì)模式,它允許在運(yùn)行時(shí)動(dòng)態(tài)地選擇算法。策略模式將算法封裝為算法族,從而可以在運(yùn)行時(shí)根據(jù)

    2024年02月15日
    瀏覽(34)
  • Java設(shè)計(jì)模式—策略模式(Strategy Mode)

    目錄 前言 一、策略模式的簡(jiǎn)介 二、策略模式的概念 三、策略模式的作用 四、策略模式的優(yōu)、缺點(diǎn) 策略模式的優(yōu)點(diǎn): 策略模式的缺點(diǎn): 五、策略模式應(yīng)用場(chǎng)景 六、代碼案例 1)抽象接口類 2)具體的策略類:減 3)具體策略類:打折 4)上下文類 5)客戶端Main代碼測(cè)試 總結(jié)

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

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

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

    2024年02月08日
    瀏覽(26)
  • Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    Java 大廠八股文面試專題-設(shè)計(jì)模式 工廠方法模式、策略模式、責(zé)任鏈模式

    ????????在平時(shí)的開發(fā)中,涉及到設(shè)計(jì)模式的有兩塊內(nèi)容,第一個(gè)是我們 平時(shí)使用的框架 (比如spring、mybatis等),第二個(gè)是我們自己開發(fā)業(yè)務(wù)使用的設(shè)計(jì)模式。 ????????面試官一般比較關(guān)心的是你在開發(fā)過(guò)程中, 有沒(méi)有使用過(guò)設(shè)計(jì)模式,或者你在簡(jiǎn)歷上寫了關(guān)于設(shè)計(jì)

    2024年02月10日
    瀏覽(29)
  • 【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——策略模式Strategy(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——策略模式Strategy(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    有各種鴨子,比如野鴨、北京鴨、水鴨等。 鴨子有各種行為,比如走路、叫、飛行等。不同鴨子的行為可能略有不同。要求顯示鴨子的信息 不同的鴨子繼承一個(gè)父類Duck,如果是相同的行為就繼承,不同行為就重寫方法 實(shí)現(xiàn) 【鴨子抽象類】 【野鴨】 【北京鴨】 【玩具鴨】

    2024年02月12日
    瀏覽(35)
  • 【策略設(shè)計(jì)模式詳解】C/Java/JS/Go/Python/TS不同語(yǔ)言實(shí)現(xiàn)

    【策略設(shè)計(jì)模式詳解】C/Java/JS/Go/Python/TS不同語(yǔ)言實(shí)現(xiàn)

    策略模式(Strategy Pattern)屬于行為型設(shè)計(jì)模式。將每一個(gè)算法封裝到具有共同接口的獨(dú)立類中,根據(jù)需要來(lái)綁定策略,使得具體實(shí)現(xiàn)和策略解耦。 當(dāng)你想使用對(duì)象中各種不同的算法變體,使用if...else 所帶來(lái)的復(fù)雜和難以維護(hù),可使用策略模式?;蛘弋?dāng)有許多相同類,它們僅

    2024年02月01日
    瀏覽(21)
  • JAVA設(shè)計(jì)模式----原型設(shè)計(jì)模式

    JAVA設(shè)計(jì)模式----原型設(shè)計(jì)模式

    定義 :用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。 類型 :創(chuàng)建類模式 類圖 : 原型模式主要用于對(duì)象的復(fù)制,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個(gè)條件: 實(shí)現(xiàn)Cloneable接口。在java語(yǔ)言有一個(gè)Cloneable接口,它的作用只

    2024年02月13日
    瀏覽(27)
  • Java設(shè)計(jì)模式 (三) 代理設(shè)計(jì)模式

    什么是代理設(shè)計(jì)模式? 代理設(shè)計(jì)模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許創(chuàng)建一個(gè)代理對(duì)象,用于控制對(duì)其他對(duì)象的訪問(wèn)。代理模式通常用于在訪問(wèn)對(duì)象時(shí)添加一些附加操作,而不是直接訪問(wèn)真實(shí)對(duì)象。代理模式可以在不改變?cè)碱惔a的情況下,通過(guò)引入代理類來(lái)增強(qiáng)功能。 代

    2024年02月12日
    瀏覽(26)
  • 【設(shè)計(jì)模式】Java設(shè)計(jì)模式詳細(xì)講解

    一、概述 Java設(shè)計(jì)模式是Java程序設(shè)計(jì)中一種重要的最佳實(shí)踐,它提供了一種框架和結(jié)構(gòu),可以幫助開發(fā)者更好地理解和設(shè)計(jì)復(fù)雜的系統(tǒng)。設(shè)計(jì)模式不僅僅是一種語(yǔ)法規(guī)則,更是一種思想和方法論,它能夠幫助開發(fā)者更好地分析、設(shè)計(jì)和實(shí)現(xiàn)軟件系統(tǒng)。 設(shè)計(jì)模式的概念最早由

    2024年02月10日
    瀏覽(19)
  • 【Java】 Java設(shè)計(jì)模式

    白白胖胖,充滿希望~ Java工廠模式(Factory Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,而無(wú)需將對(duì)象的創(chuàng)建邏輯暴露給客戶端代碼。工廠模式通過(guò)定義一個(gè)工廠方法來(lái)創(chuàng)建對(duì)象,而客戶端只需要調(diào)用該工廠方法即可獲得所需對(duì)象,從而實(shí)現(xiàn)了對(duì)象的創(chuàng)

    2024年02月09日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包