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';
      });
    

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

  • 适配器模式
    • 对原有对象适配,添加的方法与原有方法功能上大致相似
    • 使用适配器时我们新增的方法是要调用原来的方法
  • 装饰者模式
    • 装饰者提供的方法与原来的方法功能项是有一定区别的
    • 在装饰者模式中,不需要了解对象原有的功能,并且对象原有的方法照样可以原封不动地使用
目录
相关文章
|
8天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
1月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
30 3
|
22天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
37 0
|
29天前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
25 0
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
22 0
|
3月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
50 1
|
3月前
|
设计模式 JavaScript 前端开发
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
|
4月前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
79 7
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 桥接模式
js设计模式【详解】—— 桥接模式
67 6
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
49 6

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75