• 【面试题】如何理解 前端设计模式-测策略模式?


    前端面试题库 (面试必备)            推荐:★★★★★

    地址:前端面试题库

    【国庆头像】- 国庆爱国 程序员头像!总有一款适合你!

    什么是策略模式

    策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户。

    要解决的问题

    假设我们需要写一个计算年终奖的函数,我们的代码可能长这样

    1. const bonus = function (level, salary) {
    2. if (level === "S") {
    3. return salary * 1.1;
    4. }
    5. if (level === "A") {
    6. return salary * 1;
    7. }
    8. if (level === "B") {
    9. return salary * 0.9;
    10. }
    11. };

    这样写代码会有一些问题:

    • 如果情况较多,判断逻辑也会很多,代码会比较乱
    • 违反了设计原则的开发封闭原则(对拓展开放,对修改封闭),增加逻辑必须修改原函数

    我们可以借助策略模式进行优化。

    单一职责改造

    上述代码每一个条件中的 return 语句 是一个算法,我们可以将每个算法封装成一个函数

    1. const levelS = (salary) => {
    2. return salary * 1.1;
    3. };
    4. const levelA = (salary) => {
    5. return salary * 1;
    6. };
    7. const levelB = (salary) => {
    8. return salary * 0.9;
    9. };
    10. const bonus = function (level, salary) {
    11. if (level === "S") {
    12. return levelS(salary);
    13. }
    14. if (level === "A") {
    15. return levelA(salary);
    16. }
    17. if (level === "B") {
    18. return levelB(salary);
    19. }
    20. };

    这样封装完后,每中计算奖金的算法都被单独抽离,便于维护。但如果有其他情况时,我们依然要向bonus函数里写if语句,我们需要继续优化

    开发封闭改造

    1. const levelObj = {
    2. S: (salary) => {
    3. return salary * 1.1;
    4. },
    5. A: (salary) => {
    6. return salary * 1;
    7. },
    8. B: (salary) => {
    9. return salary * 0.9;
    10. },
    11. };
    12. const bonus = function (level, salary) {
    13. return levelObj[level](salary);
    14. };

    这样修改后,如果还有D情况,我们就可以这样修改

    1. levelObj.D = (salary)=> {
    2. return salary * 0.8;
    3. },

    可见,策略模式能更好的解决if语句的循环嵌套。

    上面每一个算法S,A,B,D内的逻辑不管如何变化,都不会影响bonus的核心逻辑,因此,我们说:策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户。

    在vite配置中的使用

    假设我们的vite有三个配置文件,一个公用的viteBaseConfig配置,dev模式的viteDevConfig配置,生产模式的viteProdConfig配置。

    1. import { defineConfig } from "vite";
    2. import viteBaseConfig from "./vite.base.config";
    3. import viteDevConfig from "./vite.dev.config";
    4. import viteProdConfig from "./vite.prod.config";
    5. export default defineConfig(({ command, mode, ssrBuild }) => {
    6. if (command === "serve") {
    7. return {
    8. // dev 独有配置
    9. ...viteBaseConfig,
    10. ...viteProdConfig
    11. };
    12. } else {
    13. // command === 'build'
    14. return {
    15. // build 独有配置
    16. ...viteBaseConfig,
    17. ...viteDevConfig
    18. };
    19. }
    20. });

    上述代码使用if语句来根据不同模式返回不同的配置项,我们根据刚才所学知识进行优化下。

    单一职责改造

    1. //....
    2. export default defineConfig(({ command, mode, ssrBuild }) => {
    3. const build = () => {
    4. // Object.assign中的{}是为了防止viteBaseConfig被修改。
    5. Object.assign({}, viteBaseConfig, viteProdConfig)
    6. },
    7. const serve = () => {
    8. // Object.assign中的{}是为了防止viteBaseConfig被修改。
    9. Object.assign({}, viteBaseConfig, viteDevConfig)
    10. },
    11. if (command === "serve") {
    12. return build()
    13. } else {
    14. // command === 'build'
    15. return serve();
    16. }
    17. });

    Object.assign() Object.assign() 方法将所有可枚举属性从一个或多个源对象复制到目标对象,返回修改后的对象。 注意:该方法会修改源对象!

    1. const target = { a: 1, b: 2 };
    2. const source = { b: 4, c: 5 };
    3. const returnedTarget = Object.assign(target, source);
    4. console.log(target);
    5. // expected output: Object { a: 1, b: 4, c: 5 }
    6. console.log(returnedTarget === target);
    7. // expected output: true

    开发封闭改造

    1. const envResolver = {
    2. build: () => Object.assign({}, viteBaseConfig, viteProdConfig),
    3. serve: () => Object.assign({}, viteBaseConfig, viteDevConfig),
    4. };
    5. export default defineConfig(({ command, mode, ssrBuild }) => {
    6. return envResolver[command]();
    7. });

     

     前端面试题库 (面试必备)            推荐:★★★★★

    地址:前端面试题库

    【国庆头像】- 国庆爱国 程序员头像!总有一款适合你!

  • 相关阅读:
    Camunda 7.x 系列【51】运行时服务 RuntimeService
    【JavaEE】多线程案例-定时器
    nginx配置文件组成
    CopyOnWriteArrayList源码分析
    mmdetection/mmdetection3d多机多卡训练
    netstat命令详解
    C++系列-左移运算符重载
    前端最强面试宝典 - JS 篇之数据类型
    学习pandas,应该选择哪本书进行学习?
    hack the box-blue team
  • 原文地址:https://blog.csdn.net/weixin_42981560/article/details/132815771