在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

什么是策略模式

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

什么是策略模式

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

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

優點

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

缺點

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

使用場景

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

結構圖

圖片
策略模式結構圖

策略模式的簡單示例

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

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

public interface CoolingStrategy {

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

}

定義3種降溫策略;實現策略接口

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("使用空調降溫");
    }
}

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

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();
    }
}

運行結果:

使用風扇降溫
使用空調降溫
使用冰塊降溫

以上就是一個策略模式的簡單實現

策略模式的項目實戰

場景

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

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

圖片
企業微信消息格式

獲取會話內容 - API 看API內容,數據都是json格式。思考應該如何處理:

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

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

實現

兩個策略接口

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

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

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

    @Override
    public LinkPO handleContent(String content) {
        // JSON 轉換為具體對象
        LinkWrapDTO linkWrapDTO = JacksonUtils.json2Obj(content, LinkWrapDTO.class);
        // 將對象處理成業務需要的格式
        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 轉換為具體對象
        ImageWrapDTO imageWrapDTO = JacksonUtils.json2Obj(content, ImageWrapDTO.class);
        // 將對象處理成業務需要的格式
        return Convert.convert(ImagePO.class,imageWrapDTO);
    }

    @Override
    public < T > void handleMedia(T msgData) {
        // 將數據格式轉換為具體實現的數據格式
        ImagePO imagePo = Convert.convert(ImagePO.class, msgData);
        // 調用文件服務,進一步處理文件
        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();
        // 轉為通用格式對象
        basePo = JsonUtils.json2Obj(json, BasePO.class);
        // 選取不同的策略
        Strategy strategy = strategyContext.getStrategy(basePo.getMsgType());
        // 進行處理
        strategy.handleContent(json);
        // 關于文件類消息的處理
        MediaStrategy mediaStrategy = strategyContext.getMediaStrategy(basePo.getMsgtype());
        if (null != mediaStrategy) {
            mediaStrategy.handleMedia(basePo);
        }
    }
}

以上就是策略模式的一種實現方式;

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

小結

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

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

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

    關注

    33

    文章

    8596

    瀏覽量

    151147
  • 數據
    +關注

    關注

    8

    文章

    7026

    瀏覽量

    89026
  • 算法
    +關注

    關注

    23

    文章

    4612

    瀏覽量

    92886
  • API
    API
    +關注

    關注

    2

    文章

    1500

    瀏覽量

    62013
收藏 人收藏

    評論

    相關推薦

    76 JavaScrip 面向對象編程模式實踐 策略模式

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

    #硬聲創作季 設計模式:談談你對策略模式的理解

    python
    Mr_haohao
    發布于 :2022年10月16日 13:06:10

    關于LVOOP設計模式的框架問題?

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

    LABVIEW OOP 策略模式

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

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

    設計模式,必定會在嚴謹地維護類層次上造成非常繁瑣和臃腫的代碼。這是因為C++/java等自帶一套面向對象的工具,而C語言要在代碼設計中,不斷地根據實際情況來創造面向對象的工具。 因此對于文章的內容,請大家主要關注、體會設計模式本身,更
    發表于 06-24 16:29 ?1160次閱讀

    設計模式 考試題+答案

    (Decorator) B策略模式(Strategy)C橋接模式(Bridge) D觀察者模式(Observer)轉存失敗重...
    發表于 11-07 10:20 ?39次下載
    設計<b class='flag-5'>模式</b> 考試題+答案

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

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

    設計模式最佳實踐探索—策略模式

    根據不同的應用場景與意圖,設計模式主要分為創建型模式、結構型模式和行為型模式三類。本文主要探索行為型模式中的
    的頭像 發表于 10-31 14:24 ?945次閱讀

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

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

    高頻使用的幾種設計模式

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

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

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

    設計模式行為型:策略模式

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

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

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

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

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

    Java 枚舉與策略模式、函數式接口的結合:實現高內聚低耦合的設計

    中,通常會使用枚舉來定義業務上的一組常量,那除了簡單地定義常量之外,我們如何利用枚舉來實現高內聚、低耦合的設計呢?下面介紹下枚舉和策略模式、函數式接口的組合應用。 二、枚舉+策略模式
    的頭像 發表于 11-21 14:06 ?209次閱讀
    主站蜘蛛池模板: 日韩毛片在线| 国模小丫大尺度啪啪人体| 狠狠色噜噜综合社区| 三级在线观看网站| 成年午夜一级毛片视频| 狠狠干.com| 中文字幕一精品亚洲无线一区 | 中文4480yy私人免费影院| 亚洲综合精品成人啪啪| 亚洲天堂999| 日本免费观看网站| 亚洲免费福利视频| 98色花堂国产第一页| 欧美三级久久| 免费高清在线爱做视频| 在线看免费| 在线看一区二区| 午夜伦理在线观看| 久久综合图片| 五月天婷婷丁香花| 欧美最猛黑人xxxx黑人猛交黄| 亚洲bbb| 精品黄色录像| 神马午夜嘿嘿| 中文字幕一区二区三区5566| 婷婷春色| 亚洲国产精品热久久2022| 亚洲日本视频| 久久99色| 欧美大色网| 四虎最新网| 成人做视频免费| 中文字幕一区二区三| 老司机深夜影院入口aaaa| 国产精品片| 色综合激情网| 一级黄色片在线| 日本亚洲一区二区| 国内一级特黄女人精品片| 久久精品久久久久| 2023av网站|