• js设计模式--结构型--装饰器模式


      结构型:装饰器模式

      装饰器模式,又称为装饰者模式。

      定义:在不改变原对象的基础上,通过对其进行包装扩展,使原有对象可以满足用户更复杂的需求。

      应用场景:需求 --  业务中的按钮在点击之后都弹出 【请先登录】的弹框。

    html
    <button id='open'>点击打开</button>
    <button id='close'>关闭弹框</button>

    //
    弹框创建逻辑 const Modal = (function() { let modal = null return function() { if(!modal) { modal = document.createElement('div') modal.innerHTML = '您还未登录哦~' modal.id = 'modal' modal.style.display = 'none' document.body.appendChild(modal) } return modal } })() // 点击打开按钮展示模态框 document.getElementById('open').addEventListener('click', function() { // 未点击则不创建modal实例,避免不必要的内存占用 const modal = new Modal() modal.style.display = 'block' }) // 点击关闭按钮隐藏模态框 document.getElementById('close').addEventListener('click', function() { const modal = document.getElementById('modal') if(modal) { modal.style.display = 'none' } })

      这个功能就算实现了,如果后面需求改变,让弹框被关闭后把按钮文字改成 “快去登录”,同时按钮置灰。

      那么我们就不在原有的代码上进行修改,这块就可以使用 装饰器模式。

    // 定义打开按钮
    class OpenButton {
      // 点击后展开 modal 旧逻辑
      onClick() {
        const modal = new Modal();
        modal.style.display = "block";
      }
    }
    
    // 定义按钮对应的装饰器
    class Decorator {
      // 将按钮实例传入
      constructor(open_button) {
        this.open_button = open_button;
      }
      onClick() {
        this.open_button.onClick();
        // 包装一层 新逻辑
        this.changeButtonStatus();
      }
      changeButtonStatus() {
        this.changeButtonText();
        this.disableButton();
      }
      changeButtonText() {
        const btn = document.getElementById("open");
        btn.innerHTML = "快去登录";
      }
      disableButton() {
        const btn = document.getElementById("open");
        btn.setAttribute("disabled", true);
      }
    }
    
    const openButton = new OpenButton();
    // 把实例按钮传入 Decorator,以便以后对Decorator 进行扩展。
    const decorator = new Decorator(openButton);
    
    document.getElementById("open").addEventListener("click", function () {
      // openButton.onClick()Decorator
      // 此处可以分别尝试两个实例的onClick方法,验证装饰器是否生效
      decorator.onClick();
    });

      注:React中的 HOC高阶组件就是装饰器模式在React 中的实践。

      

      

  • 相关阅读:
    【闲聊PHP】编程界的萝莉小美女--PHP
    【福利资料】程序员各种优秀资料、神器及框架
    【夯实shell基础】shell基础面面观
    【Java学习系列】第4课--Java Web相关
    【夯实PHP基础】微信小程序开发 2017.02.06
    【文学文娱】2017.01.17 周二--《谈谈日本妹子(多图预警)》
    【日常开发】使用多种工具实现 sql查询没有结果的name
    【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解
    【读书笔记】2017.01.06 星期五 《大型网站架构技术》
    【文学文娱】2016.12.23 周五--《我眼中的过年》
  • 原文地址:https://www.cnblogs.com/Sabo-dudu/p/14652336.html
Copyright © 2020-2023  润新知