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

策略模式(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] 黑芝麻驾驶员监控算法

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

相关推荐
Zzzzmo_3 分钟前
Spring MVC
java·spring·mvc·cookie/session
Carl_奕然4 分钟前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
cfm_29146 分钟前
Spring核心设计模式
java·spring·设计模式
Java小白笔记7 分钟前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云
2333!!!!!12 分钟前
rocket新手一些常见问题
java·开发语言
骇客野人18 分钟前
Springboot 的 配置文件 application.yml 和 bootrap.yml 的由来和作用
java·spring boot·后端
wuminyu22 分钟前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
CoderYanger30 分钟前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
吴声子夜歌34 分钟前
ApacheCommons——commons-lang3(Java 基础语言增强)(二)
java·开发语言·apache
xcl092535 分钟前
幼儿托管系统开发实战:从需求分析到部署上线全指南
java·spring boot·需求分析