JavaScript设计模式(十一):房子装修-装饰者模式

简介: 房子装修-装饰者模式

装饰者模式(Decorator)

不改变原对象的基础上,通过对其进行包装拓展(添加属性或者方法)使原有对象可以满足用户的更复杂需求。

  • 需求:
    1. 当输入框获取到焦点时,定义并显示提示文案;
    2. 追加需求:当输入框获取焦点时,把输入框边框变成红色;
<input id="input-val" type="text">
<span id="warn-text" style="color: red;"></span>

需求一:当输入框获取到焦点时,定义并显示提示文案;

image.png

/**
 * 需求1:当输入框获取到焦点时,显示提示文案
 */
const input = document.getElementById('input-val');
// 获取焦点
input.onfocus = function (e) {
   
   
    console.log('旧', e);
    showWarn('warn-text', '请输入不大于10个字符的名字!')
};

/**
 * 显示警告提示
 * @param {string} id   DOM id
 * @param {string} text 提示内容
 */
const showWarn = function (id, text) {
   
   
    const el = document.getElementById(id);
    el.innerText = text;
    el.style.display = 'inline';
};

需求二:追加需求:当输入框获取焦点时,把输入框边框变成红色;

image.png

  • 方式一:直接进行历史代码修改

      const input = document.getElementById('input-val');
      // 获取焦点
      input.onfocus = function (e) {
         
         
          e.target.style.border = '1px solid red';
          showWarn('warn-text', '请输入不大于10个字符的名字!')
      };
    
      /**
       * 显示警告提示
       * @param {string} id   DOM id
       * @param {string} text 提示内容
       */
      const showWarn = function (id, text) {
         
         
          const el = document.getElementById(id);
          el.innerText = text;
          el.style.display = 'inline';
      };
    
  • 方式二:装饰者模式进行需求追加修改

      /**
       * 定义装饰者
       * @param {string} id   DOM id
       * @param {function} fn 追加方法
       */
      const decorator = function (id, fn) {
         
         
          // 获取事件源
          const el = document.getElementById(id);
          // 判断事件源是否已经绑定了事件(未定义事件时el.onfocus为null)
          if (typeof el.onfocus === 'function') {
         
         
              // 缓存事件源事件(保留历史事件)
              const oldEventFn = el.onfocus;
              // 追加新的事件
              el.onfocus = function (e) {
         
         
                  // 执行历史事件
                  oldEventFn(e);
                  // 执行追加的事件
                  fn(e);
              };
          } else {
         
         
              // 事件源未绑定事件,直接为事件源添加新增回调函数
              el.onfocus = fn;
          }
      };
    
      decorator('input-val', (e) => {
         
         
          console.log('新', e);
          e.target.style.border = '1px solid red';
      });
    

适配器模式和装饰者模式区别

  • 适配器模式
    • 对原有对象适配,添加的方法与原有方法功能上大致相似
    • 使用适配器时我们新增的方法是要调用原来的方法
  • 装饰者模式
    • 装饰者提供的方法与原来的方法功能项是有一定区别的
    • 在装饰者模式中,不需要了解对象原有的功能,并且对象原有的方法照样可以原封不动地使用
目录
相关文章
|
设计模式 缓存 安全
【设计模式】【结构型模式】装饰者模式(Decorator)
一、入门 什么是装饰者模式? 装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。 为什么要装饰者模式?
332 8
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
370 124
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
设计模式 JavaScript 算法
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
419 8
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
220 2
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
295 2
|
设计模式 Java Kotlin
Kotlin - 改良设计模式 - 装饰者模式
Kotlin - 改良设计模式 - 装饰者模式
143 4
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式