女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是策略模式

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 14:15 ? 次閱讀

什么是策略模式

官話: 策略模式(Strategy Pattern): 定義一系列算法類,將每一個算法封裝起來,并讓它們可以相互替換,策略模式讓算法獨立于使用它的客戶而變化。

簡單理解就是,針對不同的場景,使用不同的策略進行處理。

優(yōu)點

  1. 算法可以自由切換。
  2. 避免使用多重條件判斷。
  3. 擴展性良好。

缺點

  1. 策略類會增多。
  2. 所有策略類都需要對外暴露。

使用場景

  1. 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。
  2. 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
  3. 如果一個對象有很多的行為,如果不用恰當?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)。

結(jié)構(gòu)圖

圖片
策略模式結(jié)構(gòu)圖

策略模式的簡單示例

場景:最近太熱了,想要降降溫,有什么辦法呢

首先,定義一個降溫策略的接口

public interface CoolingStrategy {

    /**
     * 處理方式
     */
    void handle();

}

定義3種降溫策略;實現(xiàn)策略接口

public class IceCoolingStrategy implements CoolingStrategy {
    @Override
    public void handle() {
        System.out.println("使用冰塊降溫");
    }
}
public class FanCoolingStrategy implements CoolingStrategy {

    @Override
    public void handle() {
        System.out.println("使用風扇降溫");
    }
}
public class AirConditionerCoolingStrategy implements CoolingStrategy {
    @Override
    public void handle() {
        System.out.println("使用空調(diào)降溫");
    }
}

定義一個降溫策略的上下文

public class CoolingStrategyContext {

    private final CoolingStrategy strategy;

    public CoolingStrategyContext(CoolingStrategy strategy) {
        this.strategy = strategy;
    }

    public void coolingHandle() {
        strategy.handle();
    }

}

測試

public class Main {
    public static void main(String[] args) {
        
        CoolingStrategyContext context = new CoolingStrategyContext(new FanCoolingStrategy());
        context.coolingHandle();

        context = new CoolingStrategyContext(new AirConditionerCoolingStrategy());
        context.coolingHandle();

        context = new CoolingStrategyContext(new IceCoolingStrategy());
        context.coolingHandle();
    }
}

運行結(jié)果:

使用風扇降溫
使用空調(diào)降溫
使用冰塊降溫

以上就是一個策略模式的簡單實現(xiàn)

策略模式的項目實戰(zhàn)

場景

以我自己在工作中遇到的場景為例,《企業(yè)微信會話存檔》功能,獲取各種格式的消息內(nèi)容,進行解析并保存數(shù)據(jù)。這里只針對消息處理的功能模塊,其他關(guān)于《企業(yè)微信會話存檔》的功能,有時間整理一下再發(fā)出來。

企業(yè)微信會話聊天會產(chǎn)生如下多種消息,在SpringBoot項目中應該如何使用策略模式來完成消息的解析呢?

圖片
企業(yè)微信消息格式

獲取會話內(nèi)容 - API 看API內(nèi)容,數(shù)據(jù)都是json格式。思考應該如何處理:

  1. 首先,既然要解析各種數(shù)據(jù),而每種數(shù)據(jù)格式結(jié)構(gòu)都不一樣,那么就需要先根據(jù)每種消息格式定義各自的對象,然后根據(jù)不同的需求,將json格式處理成pojo對象;
  2. 根據(jù)場景,需要定義兩個策略接口,一個是針對普通的文本格式消息的策略,另一個則是需要處理文件格式消息的策略;
  3. 定義策略處理上下文操作類,用于使用策略
  4. 每種消息,都會有一些相同的數(shù)據(jù),比如發(fā)送人、接收人、消息類型等;根據(jù)消息類型的不同,使用 key-value 的方式,讓調(diào)用者確定應該使用哪個策略來處理數(shù)據(jù)

因為格式太多,這里只使用兩個格式作為例子

實現(xiàn)

兩個策略接口

public interface Strategy {
    /**
     * 處理會話存檔的內(nèi)容
     *
     * @param content json格式的消息內(nèi)容
     * @return 結(jié)果
     */
    < T > T handleContent(String content);
}
public interface MediaStrategy {
    /**
     * 處理會話存檔媒體內(nèi)容
     *
     * @param msgData 消息內(nèi)容
     */
    < T > void handleMedia(T msgData);
}

策略的具體實現(xiàn)(偽代碼)

@Component("link")
public class LinkStrategy implements Strategy {

    @Override
    public LinkPO handleContent(String content) {
        // JSON 轉(zhuǎn)換為具體對象
        LinkWrapDTO linkWrapDTO = JacksonUtils.json2Obj(content, LinkWrapDTO.class);
        // 將對象處理成業(yè)務需要的格式
        return Convert.convert(LinkPO.class, linkWrapDTO);
    }
}
@Component("image")
public class ImageStrategy implements Strategy, MediaStrategy {

    @Autowired
    private IMsgFileService msgFileService;

    @Override
    public ImagePO handleContent(String content) {
        // JSON 轉(zhuǎn)換為具體對象
        ImageWrapDTO imageWrapDTO = JacksonUtils.json2Obj(content, ImageWrapDTO.class);
        // 將對象處理成業(yè)務需要的格式
        return Convert.convert(ImagePO.class,imageWrapDTO);
    }

    @Override
    public < T > void handleMedia(T msgData) {
        // 將數(shù)據(jù)格式轉(zhuǎn)換為具體實現(xiàn)的數(shù)據(jù)格式
        ImagePO imagePo = Convert.convert(ImagePO.class, msgData);
        // 調(diào)用文件服務,進一步處理文件
        msgFileService.newFileTask(imagePo.getImage().getSdkfileid(),
                imagePo.getMsgid() + ".jpg", imagePo.getMsgid(), imagePo.getSeq(),
                imagePo.getImage().getFilesize(), imagePo.getImage().getMd5sum(), MessageEnum.IMAGE);
    }
}

策略上下文

@Component
public class StrategyContext {

    @Resource
    Map< String, Strategy > strategys = new ConcurrentHashMap<  >();

    @Resource
    Map< String, MediaStrategy > mediaStrategys = new ConcurrentHashMap<  >();

    public Strategy getStrategy(String component) {
        return strategys.get(component);
    }

    public MediaStrategy getMediaStrategy(String component) {
        return mediaStrategys.get(component);
    }
}

使用方式(偽代碼)

public class MsgService {
   @Resource
    private StrategyContext strategyContext;
    
    public void handlerMessage() {
        // 請求api獲取消息的json
        json = api();
        // 轉(zhuǎn)為通用格式對象
        basePo = JsonUtils.json2Obj(json, BasePO.class);
        // 選取不同的策略
        Strategy strategy = strategyContext.getStrategy(basePo.getMsgType());
        // 進行處理
        strategy.handleContent(json);
        // 關(guān)于文件類消息的處理
        MediaStrategy mediaStrategy = strategyContext.getMediaStrategy(basePo.getMsgtype());
        if (null != mediaStrategy) {
            mediaStrategy.handleMedia(basePo);
        }
    }
}

以上就是策略模式的一種實現(xiàn)方式;

使用策略模式來處理不同格式的消息,雖然多了很多策略類,但是讓整個功能模塊的代碼變得清晰,松耦合,而且很容易擴展和修改,并不會影響其他流程。

小結(jié)

從以上的例子很明顯的可以看出,策略模式的靈活性;如果此時企業(yè)微信提供了一種新的消息格式,那么根本無需修改之前的代碼,只需要再寫一個新的類,實現(xiàn)消息處理策略的接口,重寫處理方法即可;

了解策略模式的優(yōu)點和缺點,合理的使用策略模式,會讓你的代碼更加的整潔優(yōu)雅。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8939

    瀏覽量

    153196
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7241

    瀏覽量

    90998
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4698

    瀏覽量

    94734
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1562

    瀏覽量

    63523
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    76 JavaScrip 面向?qū)ο缶幊?b class='flag-5'>模式實踐 策略模式

    前端javascript
    小凡
    發(fā)布于 :2022年08月28日 17:28:44

    #硬聲創(chuàng)作季 設(shè)計模式:談談你對策略模式的理解

    python
    Mr_haohao
    發(fā)布于 :2022年10月16日 13:06:10

    關(guān)于LVOOP設(shè)計模式的框架問題?

    1. 請問目前的很多設(shè)計模式,比如簡單工廠模式,策略模式之類的,labview是不是沒有框架,需要自己手工去實現(xiàn)?2. labview的actor framework是不是目前l(fā)abv
    發(fā)表于 08-07 23:14

    LABVIEW OOP 策略模式

    本帖最后由 meiyoudiandian 于 2020-5-18 21:59 編輯 《大話設(shè)計模式》這本書還是挺不錯的,不知道出于什么原因,突然心血來潮,就想跟著寫寫。一章一章慢慢來,大家一同討論,共同進步。沒有目的,沒有初衷,沒有情懷,只是素人。2020/05/18
    發(fā)表于 05-18 21:57

    C語言的策略模式提高了程序的可維護性和擴展性

    設(shè)計模式,必定會在嚴謹?shù)鼐S護類層次上造成非常繁瑣和臃腫的代碼。這是因為C++/java等自帶一套面向?qū)ο蟮墓ぞ?,而C語言要在代碼設(shè)計中,不斷地根據(jù)實際情況來創(chuàng)造面向?qū)ο蟮墓ぞ摺?因此對于文章的內(nèi)容,請大家主要關(guān)注、體會設(shè)計模式本身,更
    發(fā)表于 06-24 16:29 ?1224次閱讀

    Linux下CPU的手動頻率設(shè)定 CPU電源策略模式

    http://www.51testing.com/html/20/n-3723920.html
    發(fā)表于 01-12 11:25 ?1次下載
    Linux下CPU的手動頻率設(shè)定 CPU電源<b class='flag-5'>策略</b><b class='flag-5'>模式</b>

    設(shè)計模式最佳實踐探索—策略模式

    根據(jù)不同的應用場景與意圖,設(shè)計模式主要分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式三類。本文主要探索行為型模式中的
    的頭像 發(fā)表于 10-31 14:24 ?1155次閱讀

    為什么我不再推薦枚舉策略模式?

    我們可以看到經(jīng)典方法,創(chuàng)建了一個接口、三個策略類,還是比較啰嗦的。調(diào)用類的實現(xiàn)也待商榷,新增一個策略類還要修改榜單實例(可以用抽象工廠解決,但是復雜度又上升了)。加之我們有更好的選擇,所以此處不再推薦經(jīng)典策略
    的頭像 發(fā)表于 04-14 10:52 ?2285次閱讀

    高頻使用的幾種設(shè)計模式

    策略模式定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立于使用算法的的客戶。這個策略模式的定義是不是有點抽象呢?那
    的頭像 發(fā)表于 05-08 09:57 ?1392次閱讀
    高頻使用的幾種設(shè)計<b class='flag-5'>模式</b>

    介紹嵌入式C語言中策略模式的基本原理和實現(xiàn)方法

    嵌入式系統(tǒng)常常需要對不同的輸入采取不同的行為,例如按下按鈕后的操作、傳感器讀數(shù)后的處理、接收到的通信數(shù)據(jù)的解析等等。
    發(fā)表于 05-20 17:27 ?1096次閱讀

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

    策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設(shè)計模式屬于行為型模式。
    的頭像 發(fā)表于 06-07 11:18 ?828次閱讀
    設(shè)計<b class='flag-5'>模式</b>行為型:<b class='flag-5'>策略</b><b class='flag-5'>模式</b>

    迭代模式在UVM中的應用有哪些

    行為型設(shè)計模式數(shù)量較多,上一篇介紹了模板模式策略模式,下面對迭代模式進行介紹,挖掘其在UVM中的應用。
    的頭像 發(fā)表于 08-14 17:15 ?813次閱讀
    迭代<b class='flag-5'>模式</b>在UVM中的應用有哪些

    如何通過策略模式簡化if-else

    相信大家日常開發(fā)中會經(jīng)常寫各種分支判斷語句,比如 if-else ,當分支較多時,代碼看著會比較臃腫,那么如何優(yōu)化呢? 1、什么是策略模式? Define a family
    的頭像 發(fā)表于 10-08 16:08 ?934次閱讀
    如何通過<b class='flag-5'>策略</b><b class='flag-5'>模式</b>簡化if-else

    Java 枚舉與策略模式、函數(shù)式接口的結(jié)合:實現(xiàn)高內(nèi)聚低耦合的設(shè)計

    中,通常會使用枚舉來定義業(yè)務上的一組常量,那除了簡單地定義常量之外,我們?nèi)绾卫妹杜e來實現(xiàn)高內(nèi)聚、低耦合的設(shè)計呢?下面介紹下枚舉和策略模式、函數(shù)式接口的組合應用。 二、枚舉+策略模式
    的頭像 發(fā)表于 11-21 14:06 ?548次閱讀

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

    作者:京東工業(yè) 孫磊 一、概念 策略模式(Strategy Pattern)也稱為(Policy Parttern)。 它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變換
    的頭像 發(fā)表于 01-08 13:47 ?297次閱讀
    設(shè)計<b class='flag-5'>模式</b>-<b class='flag-5'>策略</b><b class='flag-5'>模式</b>