JavaScript设计模式(十二):城市间的公路-桥接模式

简介: 城市间的公路-桥接模式

桥接模式(Bridge)

在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦

需求:实现tabs划过的不通效果

image.png

<style>
    ul>li {
    
    
        list-style: none;
        float: left;
        margin: 10px;
        padding: 5px 10px;
        border: 1px solid #333;
    }
</style>
<ul>
    <li>ProsperLee</li>
    <li>等级:<span>Lv10</span></li>
    <li>消息:<span>99+</span></li>
</ul>
  • 方式一:

      const tabs = document.getElementsByTagName('li');
    
      tabs[0].onmouseover = function (e) {
         
         
          this.style.backgroundColor = 'red';
      };
      tabs[0].onmouseout = function (e) {
         
         
          this.style.backgroundColor = 'transparent';
      };
    
      tabs[1].onmouseover = function (e) {
         
         
          this.getElementsByTagName('span')[0].style.color = 'blue';
      };
      tabs[1].onmouseout = function (e) {
         
         
          this.getElementsByTagName('span')[0].style.color = 'black';
      };
    
      tabs[2].onmouseover = function (e) {
         
         
          this.getElementsByTagName('span')[0].style['font-weight'] = 'bolder';
      };
      tabs[2].onmouseout = function (e) {
         
         
          this.getElementsByTagName('span')[0].style['font-weight'] = 'normal';
      };
    
  • 方式二:(桥接模式 - 提取共同点)

      const tabs = document.getElementsByTagName('li');
    
      /**
       * 桥接函数 - 解耦抽象出共同点方法
       * @param {HTMLElement} el  DOM
       * @param {string} attr     样式属性
       * @param {string} value    样式值
       */
      const setStyle = function (el, attr, value) {
         
         
          el.style[attr] = value;
      };
    
      tabs[0].onmouseover = function (e) {
         
          // 这个匿名函数为桥接模式的函数,作为onmouseover和setStyle之间的桥梁
          setStyle(this, 'backgroundColor', 'red');
      };
      tabs[0].onmouseout = function (e) {
         
         // 这个匿名函数为桥接模式的函数,作为onmouseover和setStyle之间的桥梁
          setStyle(this, 'backgroundColor', 'transparent');
      };
    
      tabs[1].onmouseover = function (e) {
         
         // 这个匿名函数为桥接模式的函数,作为onmouseover和setStyle之间的桥梁
          setStyle(this.getElementsByTagName('span')[0], 'color', 'blue');
      };
      tabs[1].onmouseout = function (e) {
         
         // 这个匿名函数为桥接模式的函数,作为onmouseover和setStyle之间的桥梁
          setStyle(this.getElementsByTagName('span')[0], 'color', 'black');
      };
    
      tabs[2].onmouseover = function (e) {
         
         // 这个匿名函数为桥接模式的函数,作为onmouseover和setStyle之间的桥梁
          setStyle(this.getElementsByTagName('span')[0], 'font-weight', 'bolder');
      };
      tabs[2].onmouseout = function (e) {
         
         // 这个匿名函数为桥接模式的函数,作为onmouseover和setStyle之间的桥梁
          setStyle(this.getElementsByTagName('span')[0], 'font-weight', 'normal');
      };
    

多元化对象

多维变量类/共同点类

/**
 * 运动单元 - 多维变量类/共同点类
 * @param {number} x 
 * @param {number} y 
 */
function Speed(x, y) {
   
   
    this.x = x;
    this.y = y;
}
Speed.prototype.run = function () {
   
   
    console.log('运动起来');
}
/**
 * 着色单元 - 多维变量类/共同点类
 * @param {Color} color 
 */
function Color(color) {
   
   
    this.color = color;
}
Color.prototype.draw = function () {
   
   
    console.log('绘制色彩');
}
/**
 * 变形单元 - 多维变量类/共同点类
 * @param {string} shape 
 */
function Shape(shape) {
   
   
    this.shape = shape;
}
Shape.prototype.change = function () {
   
   
    console.log('改变形状');
}
/**
 * 说话单元 - 多维变量类/共同点类
 * @param {string} word 
 */
function Speek(word) {
   
   
    this.word = word;
}
Speek.prototype.say = function () {
   
   
    console.log('书写字体');
}

桥接使用共同点类以达到解耦作用

/**
 * 定义一个有颜色的运动小球
 * @param {number} x 
 * @param {number} y 
 * @param {Color} c 
 */
function Ball(x, y, c) {
   
   
    // 实现运动单元
    this.speed = new Speed(x, y);
    // 实现着色单元
    this.color = new Color(c);
}
Ball.prototype.init = function () {
   
   
    // 实现运动
    this.speed.run();
    // 实现着色
    this.color.draw();
}
var ball = new Ball(10, 12, 'red');
ball.init();
/**
 * 定义一个人类
 * @param {number} x 
 * @param {number} y 
 * @param {string} f 
 */
function People(x, y, f) {
   
   
    this.speed = new Speed(x, y);
    this.font = new Speek(f);
}
People.prototype.init = function () {
   
   
    // 实现运动
    this.speed.run();
    // 实现说话
    this.font.say();
}
var people = new People(10, 12, 16);
people.init();
/**
 * 定义一个精灵
 * @param {number} x 
 * @param {number} y 
 * @param {Color} c 
 * @param {string} s 
 */
function Sprite(x, y, c, s) {
   
   
    this.speed = new Speed(x, y);
    this.color = new Color(c);
    this.shape = new Shape(s);
}
Sprite.prototype.init = function () {
   
   
    this.speed.run();
    this.color.draw();
    this.shape.change();
}
var sprite = new Sprite(10, 12, 'red', '矩形');
sprite.init();

桥接模式最主要的特点:

将实现层(如元素绑定的事件)与抽象层(如修饰页面UI逻辑)解耦分离,使两部分可以独立变化,桥接模式主要是对结构之间的解构。

目录
相关文章
|
1月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
29 2
|
2月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
2月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
39 3
|
3月前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
32 1
|
3月前
|
设计模式 Java
Java设计模式-桥接模式(9)
Java设计模式-桥接模式(9)
|
2月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
50 0
|
4月前
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)
|
4月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
66 1
|
4月前
|
设计模式 JavaScript 前端开发
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
|
4月前
|
设计模式 缓存 项目管理
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决