二十三种设计模式(二十二)--策略模式

策略模式(Strategy)

如果某一个程序中用到各种各样的算法, 这些算法如果预编译的程序中会非常臃肿, 此时策略模式就可以实现各种算法的灵活取用

实际需求如下:

我有一个车载道路安全应用程序, 需要FDW道路前向预警功能, TSR道路标志牌识别功能, DMS驾驶员监控功能, 分别对应三种类型的算法模型, 而这三种算法模型由不同的供应商提供, 具体采用哪个供应商的算法要根据实际测试的效果来评判, 但在我们的应用中要提供能够兼容所有算法的接口

此时用策略模式会是一个非常好的选择, 代码实现如下:

java 复制代码
// 前向预警
interface FDW {
    void reference();
}

// 交通标识牌识别
interface TSR {
    void predict();
}

// 驾驶员监控
interface DMS {
    void forward();
}


class DesayFDW implements FDW {
    @Override
    public void reference() {
        System.out.println("[FDW] 德赛西威道路前向预警算法");
    }
}

class DesayTSR implements TSR {
    @Override
    public void predict() {
        System.out.println("[TSR] 德赛西威道路标识牌识别算法");
    }
}

class HorizonFDW implements FDW {
    @Override
    public void reference() {
        System.out.println("[FDW] 地平线道路前向预警算法");
    }
}

class HorizonTSR implements TSR {
    @Override
    public void predict() {
        System.out.println("[TSR] 地平线道路标识牌识别算法");
    }
}

class HorizonDMS implements DMS {
    @Override
    public void forward() {
        System.out.println("[DMS] 地平线驾驶员监控算法");
    }
}

class BlackSesameTSR implements TSR {
    @Override
    public void predict() {
        System.out.println("[TSR] 黑芝麻道路标识牌识别算法");
    }
}

class BlackSesameDMS implements DMS {
    @Override
    public void forward() {
        System.out.println("[DMS] 黑芝麻驾驶员监控算法");
    }
}

// 算法控制器, 提供动态的设置算法和运行算法进行计算的能力
class AIAlgorithmController {
    FDW fdw;
    DMS dms;
    TSR tsr;

    public void setFdw(FDW fdw) {
        this.fdw = fdw;
    }

    public void setDms(DMS dms) {
        this.dms = dms;
    }

    public void setTsr(TSR tsr) {
        this.tsr = tsr;
    }

    public void runFdwInfer() {
        fdw.reference();
    }

    public void runTsrInfer() {
        tsr.predict();
    }

    public void runDmsInfer() {
        dms.forward();
    }
}

上述代码示例中, 有DMS, TSR, FDW三种策略, 针对三种策略, 各个供应商提供了7种算法, 最终所有的算法在控制器中得到灵活取用

实际调用示例如下:

java 复制代码
public class StrategyPattern {
    public static void main(String[] args) {
        // 通过算法控制器AIAlgorithmController动态地选择合适的算法
        AIAlgorithmController aiController = new AIAlgorithmController();
        aiController.setDms(new BlackSesameDMS());
        aiController.setTsr(new HorizonTSR());
        aiController.setFdw(new DesayFDW());

        aiController.runFdwInfer();
        aiController.runTsrInfer();
        aiController.runDmsInfer();
    }
}

输出:

复制代码
[FDW] 德赛西威道路前向预警算法
[TSR] 地平线道路标识牌识别算法
[DMS] 黑芝麻驾驶员监控算法

策略模式和状态模式在代码组织上非常相似, 如果状态模式将状态暴露给调用者, 那其实就和策略模式没什么区别了. 所以两者的关键区别就在这里

相关推荐
知兀4 分钟前
【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换
java
StockTV6 分钟前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
User_芊芊君子8 分钟前
【OpenAI 把 AI 玩明白了】:自主推理 + 动态知识图谱,这 4 个技术突破要颠覆行业
java·人工智能·知识图谱
c++之路41 分钟前
C++20概述
java·开发语言·c++20
Championship.23.241 小时前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
橘子海全栈攻城狮1 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
逻辑驱动的ken1 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
冷雨夜中漫步2 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
直奔標竿2 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
one_love_zfl2 小时前
java面试-微服务组件篇
java·微服务·面试