js设计模式一之策略模式(通俗易懂实战)

1.简介:

        策略模式是行为模式的一种,在例如java语言的表现是通过处理对象和行为的关系,通过多态性来消除if-else分支,而每一个分支都算是一个策略,以此来达到统一的变化。

        而在js中,多态性是自然而然就存在了,下面将以js的方式演示如何使用策略模式。

2.代码:

        在js中,函数的表达更具个性,相当于一个个对象,再不使用类的情况下,下面是对于处理键盘快捷键在一个页面上使用通过策略模式达到更好维护性的应用。

2.1  定义键盘事件的每一个策略

   const singleSave = () => {
      if (!checkTabIsSave()) return;
      scriptSave();
    };
    //F5 run test
    const F5Trigger = () => {
      runTestBeforeCheckToSave();
    };
    //ctrl+shift+~
    const openConsole = () => {
      if (showConsole.value) return;
      showConsole.value = true;
    };

    //ctrl+b隐藏侧边树状资源
    const toggleSourceTree = () => {
      showTree.value = !showTree.value;
    };

2.2 设置策略映射字典

  const keyBoardMapper = {
      "ctrlkey+83": singleSave,
      "ctrlkey+shiftkey+192": openConsole,
      "ctrlkey+66": toggleSourceTree,
      "116": F5Trigger,
    };

2.3 定义统一触发器

        这里通过键盘key对应字典中的映射从而去消去if-else分支达到统一处理的方式,符合开放封闭原则

 //键盘统一触发器
    const keyBoardTrigger = (e) => {
      const curKey = e.keyCode || e.which || e.charCode;
      if (e.key === "F5") {
        e.preventDefault();
      }
      if (e.ctrlKey && curKey === 83) {
        e.preventDefault();
      }
      const ctrlKey = e.ctrlKey;
      const shiftKey = e.shiftKey;
      const key = `${ctrlKey ? "ctrlkey+" : ""}${
        shiftKey ? "shiftkey+" : ""
      }${curKey}`;
      if (keyBoardMapper[key]) {
        keyBoardMapper[key]();
      }
    };

2.4 最后调用统一触发器

        这里使用的是vue3,在挂载钩子和卸载钩子中进行处理

  onMounted(() => {
      document.addEventListener("keydown", keyBoardTrigger);
  });

  onUnmounted(() => {
    document.removeEventListener("keydown", keyBoardTrigger);
  });

2.5 完整代码

 /* 事件监听区域 */
    //ctrl+s
    const singleSave = () => {
      if (!checkTabIsSave()) return;
      scriptSave();
    };
    //F5 run test
    const F5Trigger = () => {
      runTestBeforeCheckToSave();
    };
    //ctrl+shift+~
    const openConsole = () => {
      if (showConsole.value) return;
      showConsole.value = true;
    };

    //ctrl+b隐藏侧边树状资源
    const toggleSourceTree = () => {
      showTree.value = !showTree.value;
    };

    const keyBoardMapper = {
      "ctrlkey+83": singleSave,
      "ctrlkey+shiftkey+192": openConsole,
      "ctrlkey+66": toggleSourceTree,
      "116": F5Trigger,
    };

    //键盘统一触发器
    const keyBoardTrigger = (e) => {
      const curKey = e.keyCode || e.which || e.charCode;
      if (e.key === "F5") {
        e.preventDefault();
      }
      if (e.ctrlKey && curKey === 83) {
        e.preventDefault();
      }
      const ctrlKey = e.ctrlKey;
      const shiftKey = e.shiftKey;
      const key = `${ctrlKey ? "ctrlkey+" : ""}${
        shiftKey ? "shiftkey+" : ""
      }${curKey}`;
      if (keyBoardMapper[key]) {
        keyBoardMapper[key]();
      }
    };

  onMounted(() => {
      document.addEventListener("keydown", keyBoardTrigger);
    });

    onUnmounted(() => {
      document.removeEventListener("keydown", keyBoardTrigger);
    });

3. 总结

        在js中策略模式主要通过一个字典映射来构建对分支策略的处理,再通过一个通用的函数来调用获取反馈,相当于是通过对象的多态性来消除了if-else,只是js中通过函数的方式来处理,这个模式在平时的编码也非常实用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值