代码中的设计模式-策略模式

假如我们有一段代码,有很多的if else

javascript 复制代码
function executeAction(type) {
    if (type === 'A') {
        console.log('Action A');
    } else if (type === 'B') {
        console.log('Action B');
    } else if (type === 'C') {
        console.log('Action C');
    } else {
        console.log('Unknown action');
    }
}

executeAction('A'); // 输出: Action A
executeAction('B'); // 输出: Action B
executeAction('C'); // 输出: Action C
executeAction('D'); // 输出: Unknown action

如果if else有很多很多, 那么代码就会变的非常不直观且难以维护

那对于这种情况有什么好的解决办法吗

这就引出了我们今天的主角: 策略模式

什么是策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它允许你定义一系列算法或行为,并将它们封装在独立的策略类中。然后,你可以根据需要在运行时选择不同的策略。这种模式特别适合处理复杂的条件逻辑,比如多个 if-else if 语句。

下面来看使用策略模式的解决方案

我们可以将每个条件分支封装在一个策略类中,然后在运行时选择合适的策略。

javascript 复制代码
// 定义策略接口
class Strategy {
    execute() {
        throw new Error('You have to implement the method execute!');
    }
}

// 具体策略A
class StrategyA extends Strategy {
    execute() {
        console.log('Action A');
    }
}

// 具体策略B
class StrategyB extends Strategy {
    execute() {
        console.log('Action B');
    }
}

// 具体策略C
class StrategyC extends Strategy {
    execute() {
        console.log('Action C');
    }
}

// 默认策略
class DefaultStrategy extends Strategy {
    execute() {
        console.log('Unknown action');
    }
}

// 策略上下文
class Context {
    constructor() {
        this.strategies = {
            'A': new StrategyA(),
            'B': new StrategyB(),
            'C': new StrategyC()
        };
    }

    executeAction(type) {
        const strategy = this.strategies[type] || new DefaultStrategy();
        strategy.execute();
    }
}

// 使用策略模式
const context = new Context();
context.executeAction('A'); // 输出: Action A
context.executeAction('B'); // 输出: Action B
context.executeAction('C'); // 输出: Action C
context.executeAction('D'); // 输出: Unknown action

策略接口 (Strategy): 定义了一个 execute 方法,所有具体的策略类都必须实现这个方法。

具体策略类 (StrategyA, StrategyB, StrategyC, DefaultStrategy): 每个类都实现了 execute 方法,执行特定的操作。

策略上下文 (Context): 维护一个策略对象的映射,并根据传入的 type 选择合适的策略来执行。如果没有找到对应的策略,则使用默认策略。

使用策略模式: 通过 Context 类的 executeAction 方法来执行不同的策略。

这样实现有哪些好处

可扩展性: 如果需要添加新的策略,只需添加一个新的策略类,并在 Context 中注册即可,无需修改现有代码。

代码清晰: 将复杂的条件逻辑分解到不同的策略类中,使代码更易于理解和维护。

灵活性: 可以在运行时动态地选择不同的策略,而不需要修改代码。

相关推荐
bryant_meng12 小时前
【Codex】Part 19 — Codex Prompt Design Patterns
设计模式·prompt·playbook·结果优先·用证据定义完成
AI人工智能+电脑小能手12 小时前
大白话说Java设计模式-38-迭代器模式(业务实战篇)
java·设计模式·迭代器模式·stream·遍历封装·集合通用·分页遍历
qyyyyy57015 小时前
芯片 Application Note PDF 怎么读?参考电路、BOM 和调试波形翻译实战
嵌入式硬件·设计模式·机器翻译·web application
Nontee17 小时前
Quartz 集群 + 策略模式:逾期预警推送系统设计实录
linux·服务器·策略模式
苦猿的大模型日记17 小时前
Day51|从0学习Claude Code(一):一个while循环加一个Bash,复刻Claude Code的心脏
人工智能·学习·bash
程序员贺加贝17 小时前
列表导出不够用-SaaS-ERP-单据详情导出的-Provider-模板与文档型-Excel-设计
java·后端·设计模式·架构·excel
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-34-命令模式(业务实战篇)
java·spring·设计模式·命令模式·异步任务·撤销重做·事务封装
用户202252215062 天前
字节发布"豆包工作",我从AI PM角度看到的不是功能,是上下文
设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-37-中介者模式(源码剖析篇)
java·设计模式·线程池·中介者模式·源码分析·executor·applicationeventmulticaster
电子科技圈2 天前
IAR与东软睿驰达成战略合作,强化软件开发效率与生态协作
设计模式·开源·软件工程·软件构建·代码规范·设计规范·代码复审