定义:

将抽象部分与它的实现部分分离,使他们都可以独立的变化。

也就是说,桥接模式里面有两个角色:

- 扩充抽象类

- 具体实现类

在写桥接模式之前,想在写一下关于抽象的理解。我觉得抽象这个概念过于抽象,而不易于理解。

抽象的概念:

从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。 ---[百度百科]

在自然语言中,很多人把凡是不能被人们的感官所直接把握的东西,也就是通常所说的“看不见,摸不着”的东西,叫做抽象。

比如:物体的形状,颜色都是抽象的,我们去定义一个物体形状的抽象方法

  1. // 定义形状的方法--抽象的方法,表示某一实物的共同特征
  2. let shape = function(shape) {
  3. this.shape = shape
  4. }
  5.  
  6. let circle = new shape('圆')
  7. console.log('circle', circle.shape) // 圆
  8.  
  9. let rectangle = new shape('长方形')
  10. console.log('rectangle', rectangle.shape) //长方形

解释完抽象的概念,回归正文。 那如何使用桥接模式呢?

最简单的桥接模式

  1. var each = function (arr, fn) {
  2. for (var i = ; i < arr.length; i++) {
  3. var val = arr[i];
  4. if (fn.call(val, i, val, arr)) {
  5. return false;
  6. }
  7. }
  8. };
  9. var arr = [, , , ];
  10. each(arr, function (i, v) {
  11. arr[i] = v * ;
  12. });

each函数是一个抽象类,而fn函数则是具体的实现,在这段代码中,抽象部分和实现部分的更改是互不影响的,可以独立的改变,所以,这个例子虽然简单,但是是一个典型的桥接模式的应用。

在事件中使用桥接模式

比如鼠标点击事件,字体和颜色发生对应的改变

  1. html::
  2. <ul>
  3. <li onclick="test1(this)" id="li1">测试1</li>
  4. <li onclick="test2(this)" id="li2">测试2</li>
  5. <li onclick="test3(this)" id="li3">测试3</li>
  6. <li onclick="test4(this)" id="li4">测试4</li>
  7. </ul>

使用桥接模式,首先将公共的方法进行抽离,抽象的部分

  1. function some(dom, color, size) {
  2. dom.style.color = color;
  3. dom.style.fontSize = size
  4. }

然后再每个方法使用的时候,去实现

  1. // 具体的实现
  2. function test1(val) {
  3. some(document.getElementById(val.id), 'red', '20px')
  4. }
  5. function test2(val) {
  6. some(document.getElementById(val.id), 'green', '30px')
  7. }
  8. function test3(val) {
  9. some(document.getElementById(val.id), 'blue', '40px')
  10. }
  11. function test4(val) {
  12. some(document.getElementById(val.id), 'pink', '50px')
  13. }

桥接组织多个单元

  1. var Class1 = function (a,b,c) {
  2. this.a = a;
  3. this.b = b;
  4. this.c = c;
  5. };
  6. var Class2 = function (d,e) {
  7. this.d = d;
  8. this.e = e;
  9. };
  10. var BridgeClass = function (a,b,c,d,e) {
  11. this.Class1 = new Class1(a,b,c);
  12. this.Class2 = new Class1(d,e);
  13. }

利用桥接模式,可以将多个单体组织在一起,方便简单。

使用场景:

事件回调函数、请求接口之间进行桥接、用于连接公开的API代码和私用实现的代码

优点:

1.分离接口和实现部分,一个实现未必不变的绑定在一个接口上,抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的变化,同事,抽象和实现也进行了充分的解耦,也有利于分层,从而产生更好的结构化系统。

2.提高可扩展性。

3.实现细节对客户透明,可以回客户隐藏实现细节。

缺点:

大量的类将导致开发成本的增加,同时在性能方面也可能会有所减少。

总结

学习桥接模式关键是要理解抽象部分与实现部分的分离,使二者可以独立的变化,而不互相约束影响。js插件灵活的变化,适用场景的多变就非常适合使用这种模式来实现,使用桥接模式最重要的就是找出系统中不同的变化维度。

js --桥接模式的更多相关文章

  1. js桥接模式

    桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化. 抽象化和实现部分在一起,桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化封装到另外 ...

  2. js设计模式-桥接模式

    桥接模式定义:桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化".这句话有三个关键词,也就是抽象化.实现化和 ...

  3. 《JS设计模式笔记》 4,桥接模式

    //桥接模式的作用在于将实现部分和抽象部分分离开来,以便两者可以独立的变化. var singleton=function(fn){ var result; return function(){ re ...

  4. js设计模式(3)---桥接模式

    0.前言 看设计模式比较痛苦,一则是自己经验尚浅,不能体会到使用这些设计模式的益处:二则是不能很好把握使用这些设计模式的时机.所以这一部分看得断断续续,拖拖拉拉,为了了却这快心病,决定最近一口气看完几 ...

  5. js原生设计模式——13桥接模式(相同业务逻辑抽象化处理的职责链模式)

    桥接模式之多元化类之间的实例化调用实例 <!DOCTYPE html><html lang="en"><head>    <meta ch ...

  6. JS设计模式——8.桥接模式

    桥接模式的用途 在实现API的时候,桥接模式非常有用. 在设计一个JavaScript API的时候,可以用这个模式来弱化它与使用它的类和对象之间的耦合. 示例:事件监听器 桥接模式最常见和实际的应用 ...

  7. JS常用的设计模式(6)——桥接模式

    桥接模式的作用在于将实现部分和抽象部分分离开来, 以便两者可以独立的变化.在实现api的时候, 桥接模式特别有用.比如最开始的singleton的例子. var singleton = functio ...

  8. 【读书笔记】读《JavaScript设计模式》之桥接模式

    桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化. 一.使用场景 使用场景一:事件监控 对于前端而言,最典型的使用场景——事件监控.如—— addEvent(element ...

  9. 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)

    桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...

随机推荐

  1. 生成一个字母数字组合的n位随机码、随机数、随机字符串

    package com.cms.util; /** * 生成一个字母数字组合的n位随机码 * @author abc * */ public class CodeUtil { // private f ...

  2. 第10组 Alpha冲刺(5/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 学习调用中国天气网API,接近实现天气推送功能 对天气推送的形式进行讨论及重确 ...

  3. NGINX Cache Management (.imh nginx)

    In this article, we will explore the various NGINX cache configuration options, and tips on tweaking ...

  4. HBase 介绍

    HBase的列族式存储 列族式存储的概念 HBase Table的组成 Table = RowKey + Family + Column + Timestamp + Value 数据存储模式 (Row ...

  5. Deep High-Resolution Representation Learning for Human Pose Estimation

    Deep High-Resolution Representation Learning for Human Pose Estimation 2019-08-30 22:05:59 Paper: CV ...

  6. jdbc批量写入

    jdbc加了rewriteBatchedStatements=true就可以提升很多倍,

  7. 解决Electron安装包下载慢的问题

    问题描述 在运行官网示例的过程中,一个安装包(electron-v5.0.8-darwin-x64.zip)下载特别慢,基本下载不下来.更改npm的安装源到taobao的镜像,也没有效果. 解决方案 ...

  8. docker安装并运行redis

    拉取镜像: [mall@VM_0_7_centos ~]$ sudo docker pull redis:3.2 [sudo] password for mall: 3.2: Pulling from ...

  9. Redis 主从、哨兵Sentinel、Jedis

    Redis 主从.哨兵Sentinel.Jedis 2017年02月15日 15:52:48 有且仅有 阅读数 6183 文章标签: redis主从sentineljedis 更多 分类专栏: 7/1 ...

  10. 自定义电脑IP地址

    一台电脑有了ip地址才能上网,ip就是电脑的标识,在互联网中就是其中的一份子. 默认情况下电脑会自动获取IP地址,当无法自动获取或与网络IP地址相冲突时,就要自行设置电脑静态IP地址. 如下图步骤: