定义:

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

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

- 扩充抽象类

- 具体实现类

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

抽象的概念:

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

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

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

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

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

最简单的桥接模式

var each = function (arr, fn) {
for (var i = ; i < arr.length; i++) {
var val = arr[i];
if (fn.call(val, i, val, arr)) {
return false;
}
}
};
var arr = [, , , ];
each(arr, function (i, v) {
arr[i] = v * ;
});

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

在事件中使用桥接模式

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

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

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

function some(dom, color, size) {
dom.style.color = color;
dom.style.fontSize = size
}

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

// 具体的实现
function test1(val) {
some(document.getElementById(val.id), 'red', '20px')
}
function test2(val) {
some(document.getElementById(val.id), 'green', '30px')
}
function test3(val) {
some(document.getElementById(val.id), 'blue', '40px')
}
function test4(val) {
some(document.getElementById(val.id), 'pink', '50px')
}

桥接组织多个单元

var Class1 = function (a,b,c) {
this.a = a;
this.b = b;
this.c = c;
};
var Class2 = function (d,e) {
this.d = d;
this.e = e;
};
var BridgeClass = function (a,b,c,d,e) {
this.Class1 = new Class1(a,b,c);
this.Class2 = new Class1(d,e);
}

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

使用场景:

事件回调函数、请求接口之间进行桥接、用于连接公开的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. Nginx配置简单基于域名的虚拟主机

    首先修改hosts文件,让浏览器在看到a.com或是www.a.com的网址时知道上哪里去找: # Copyright (c) 1993-2009 Microsoft Corp. # # This i ...

  2. Git push origin dev-rgq-istokenstatus 【dev-rgq-istokenstatus -> dev-rgq-istokenstatus】

    RenGuoQiang@PC-RENGUOQIANG MINGW64 /d/zgg/zgg-crm (dev-rgq-istokenstatus) $ git push origin dev-rgq- ...

  3. Xamarin图表开发基础教程(7)OxyPlot框架

    Xamarin图表开发基础教程(7)OxyPlot框架 Xamarin.Forms中使用OxyPlot框架 在Xamarin. Forms平台上实现图表显示需要完成以下的步骤: 1.添加OxyPlot ...

  4. Spring cloud微服务安全实战-7-5配置grafana图表及报警

    先过一下grafana的配置文件 grafana的配置文件. 右键服务的地址.发信人 账号 和面等 配置要连到prometheus上. 登陆的密码是多少,第二行是不允许用户注册. dashboard. ...

  5. django安装使用xadmin

    Xadmin介绍 直接替换掉Django自带的admin系统,并提供了很多有用的东西:完全的可扩展的插件支持,基于Twitter Bootstrap的漂亮UI. 完全替代Django admin 支持 ...

  6. TWA那些事儿

    一.参考学习 https://developer.android.google.cn/studio/ https://juejin.im/post/5cf50755e51d455d850d3aa7

  7. [LeetCode] 377. Combination Sum IV 组合之和 IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  8. 【视频开发】【Live555】live555实现h264码流RTSP传输

    1.概述 liveMedia 库中有一系列类,基类是Medium,这些类针对不同的流媒体类型和编码. 其中的StreamFrame类文件(如MPEG4VideoStreamFramer)为流传输关键. ...

  9. 【ARM-Linux开发】Ubuntu下的/usr目录权限,导致不能使用sudo命令的修复

    刚开始运行sudo时,报了下面这个错误 sudo: must be setuid root,于是上网找解决方法,搜索出来的都是这样解决的 ls -l  /usr/bin/sudochown root: ...

  10. 湖南省第6届程序大赛 Repairing a Road

    Problem G Repairing a Road You live in a small town with R bidirectional roads connecting C crossing ...