js桥接模式
桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。
抽象化和实现部分在一起,桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化封装到另外一个类中,这样的一个思路也就是桥接模式的实现,大家可以对照桥接模式的实现代码来解决我们的分析思路。
为了帮助大家理清对桥接模式中类之间关系,这里给出桥接模式的类图结构:

我们再来看看桥接模式的使用场景,在以下情况下应当使用桥接模式:
- 如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系。
- 设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的。
- 需要跨越多个平台的图形和窗口系统上。
- 一个类存在两个独立变化的维度,且两个维度都需要进行扩展。
C#桥接模式:
namespace 桥接模式
{
class Program
{
static void Main(string[] args)
{
HandsetBrand ab;
ab = new HandsetBrandN(); ab.SetHandsetSoft(new HandsetGame());
ab.Run(); ab.SetHandsetSoft(new HandsetAddressList());
ab.Run(); ab = new HandsetBrandM(); ab.SetHandsetSoft(new HandsetGame());
ab.Run(); ab.SetHandsetSoft(new HandsetAddressList());
ab.Run(); Console.Read();
}
} //手机品牌
abstract class HandsetBrand
{
protected HandsetSoft soft; //设置手机软件
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}
//运行
public abstract void Run(); } //手机品牌N
class HandsetBrandN : HandsetBrand
{
public override void Run()
{
soft.Run();
}
} //手机品牌M
class HandsetBrandM : HandsetBrand
{
public override void Run()
{
soft.Run();
}
} //手机品牌S
class HandsetBrandS : HandsetBrand
{
public override void Run()
{
soft.Run();
}
} //手机软件
abstract class HandsetSoft
{ public abstract void Run();
} //手机游戏
class HandsetGame : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机游戏");
}
} //手机通讯录
class HandsetAddressList : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机通讯录");
}
} //手机MP3播放
class HandsetMP3 : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机MP3播放");
}
}
}
js模拟高级语言的桥接模式:
//手机品牌
var HandsetBrand = function(){
this.soft = null;
};
//设置手机软件
HandsetBrand.prototype.setHandsetSoft = function(soft){
this.soft = soft;
};
//运行
HandsetBrand.prototype.run = function(){
throw new Error('具体实现必须由子类重写');
}; //手机品牌N
var HandsetBrandN = function(){};
HandsetBrandN.prototype = new HandsetBrand();
HandsetBrandN.prototype.run = function(){
this.soft.run();
}; //手机品牌M
var HandsetBrandM = function(){};
HandsetBrandM.prototype = new HandsetBrand();
HandsetBrandM.prototype.run = function(){
this.soft.run();
}; //手机品牌S
var HandsetBrandS = function(){};
HandsetBrandS.prototype = new HandsetBrand();
HandsetBrandS.prototype.run = function(){
this.soft.run();
}; //手机软件
var HandsetSoft = function(){};
HandsetSoft.prototype.run = function(){
throw new Error('具体实现必须由子类重写');
}; //手机游戏
var HandsetGame = function(){};
HandsetGame.prototype = new HandsetSoft();
HandsetGame.prototype.run = function(){
console.log('运行手机游戏');
}; //手机通讯录
var HandsetAddressList = function(){};
HandsetAddressList.prototype = new HandsetSoft();
HandsetAddressList.prototype.run = function(){
console.log('运行手机通讯录');
}; //手机MP3播放
var HandsetMP3 = function(){};
HandsetMP3.prototype = new HandsetSoft();
HandsetMP3.prototype.run = function(){
console.log('运行手机MP3播放');
}; //调用:
//
var ab = new HandsetBrandN(); ab.setHandsetSoft(new HandsetGame());
ab.run(); ab.setHandsetSoft(new HandsetAddressList());
ab.run(); ab = new HandsetBrandM(); ab.setHandsetSoft(new HandsetGame());
ab.run(); ab.setHandsetSoft(new HandsetAddressList());
ab.run();
js语言特性的桥接模式:
//手机软件
var handsetSoft = {}; //手机品牌
var HandsetBrand = function(type){
this.soft = null;
this.type = type;
}; HandsetBrand.prototype = {
//修正构造函数指向
constructor:HandsetBrand,
//设置手机软件
setHandsetSoft:function(soft){
this.soft = soft;
},
//运行
run:function(){
this[type] && this[type]();
}
}; //手机游戏
handsetSoft.game = function(){ console.log('运行手机游戏'); };
//手机通讯录
handsetSoft.addressList = function(){ console.log('运行手机通讯录'); };
//手机MP3播放
handsetSoft.mp3 = function(){ console.log('运行手机MP3播放'); }; //手机品牌N 手机品牌M 手机品牌S
['brandN','brandM','brandS'].forEach(function(prop){
HandsetBrand.prototype[prop] = function(){
this.soft && this.soft();
};
}); //调用:
//
var hb = new HandsetBrand('brandN');
hb.setHandsetSoft(handsetSoft.game);
hb.run(); hb.setHandsetSoft(handsetSoft.addressList);
hb.run(); hb = new HandsetBrand('brandM');
hb.setHandsetSoft(handsetSoft.game);
hb.run(); hb.setHandsetSoft(handsetSoft.addressList);
hb.run();
js桥接模式的更多相关文章
- js --桥接模式
定义: 将抽象部分与它的实现部分分离,使他们都可以独立的变化. 也就是说,桥接模式里面有两个角色: - 扩充抽象类 - 具体实现类 在写桥接模式之前,想在写一下关于抽象的理解.我觉得抽象这个概念过于抽 ...
- js设计模式-桥接模式
桥接模式定义:桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化".这句话有三个关键词,也就是抽象化.实现化和 ...
- 《JS设计模式笔记》 4,桥接模式
//桥接模式的作用在于将实现部分和抽象部分分离开来,以便两者可以独立的变化. var singleton=function(fn){ var result; return function(){ re ...
- js设计模式(3)---桥接模式
0.前言 看设计模式比较痛苦,一则是自己经验尚浅,不能体会到使用这些设计模式的益处:二则是不能很好把握使用这些设计模式的时机.所以这一部分看得断断续续,拖拖拉拉,为了了却这快心病,决定最近一口气看完几 ...
- js原生设计模式——13桥接模式(相同业务逻辑抽象化处理的职责链模式)
桥接模式之多元化类之间的实例化调用实例 <!DOCTYPE html><html lang="en"><head> <meta ch ...
- JS设计模式——8.桥接模式
桥接模式的用途 在实现API的时候,桥接模式非常有用. 在设计一个JavaScript API的时候,可以用这个模式来弱化它与使用它的类和对象之间的耦合. 示例:事件监听器 桥接模式最常见和实际的应用 ...
- JS常用的设计模式(6)——桥接模式
桥接模式的作用在于将实现部分和抽象部分分离开来, 以便两者可以独立的变化.在实现api的时候, 桥接模式特别有用.比如最开始的singleton的例子. var singleton = functio ...
- 【读书笔记】读《JavaScript设计模式》之桥接模式
桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化. 一.使用场景 使用场景一:事件监控 对于前端而言,最典型的使用场景——事件监控.如—— addEvent(element ...
- 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)
桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...
随机推荐
- mysql编译参数详解(./configure)
1.--prefix=PREFIX:指定程序安装路径: 2.--enable-assembler:使用汇编模式:(文档说明:compiling in x86 (and sparc) versions ...
- Connection cannot be null when 'hibernate.dialect' not set
严重: Exception sending context initialized event to listener instance of class [org.springframework.w ...
- es6数组的一些函数方法使用
数组函数forEach().map().filter().find().every().some().reduce()等 数组函数(这里的回调函数中的index和arr都可以省略,回调函数后有参数是设 ...
- 通过天天模拟器加burpsuite抓取手机app流量
通过天天模拟器,代理抓取安卓app数据包.也可以抓取https. 1.下载天天模拟器,官方下载即可,下载安装. 2.启动天天模拟器,设置代理,点击上方wlan设置图标,打开wlan设置,如下: 3.鼠 ...
- centos系统时间相差8个小时解决方案
查看当前系统时间 [root@centos64 ~]# date 查看硬件时间 [root@centos64 ~]# hwclock --show 同步时间可以用:ntpdate us.pool.nt ...
- 我的Android进阶之旅------>Android百度地图定位SDK功能学习
因为项目需求,需要使用百度地图的定位功能,因此去百度地图开发平台下载了百度地图的Android定位SDK最新版本的开发包和示例代码学习. Android 定位SDK地址:http://develope ...
- openssl之EVP系列之7---信息摘要算法结构概述
openssl之EVP系列之7---信息摘要算法结构概述 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作者:Dragon ...
- Mac 安装Minikube
环境信息: guoguo-MacBook-Pro-3:~ guoguo$ docker versionClient: Version: 17.12.0-ce API version: 1. ...
- Oracle学习笔记—常用函数
这里记录一些oracle常用的函数. TO_NUMBER()函数 将字符串类型转换成一个 number 类型的值. SELECT TO_NUMBER('100.00') FROM DUAL; TO_C ...
- What's the difference between 'Even if' and 'Even though'?
为一个英语词组语法写一篇Blog: even if 与 even though 这两个词组大致意思相当,但强调的侧重有所不同. even if与even though的区别: even if一般引导的 ...