桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。

抽象化和实现部分在一起,桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化封装到另外一个类中,这样的一个思路也就是桥接模式的实现,大家可以对照桥接模式的实现代码来解决我们的分析思路。

为了帮助大家理清对桥接模式中类之间关系,这里给出桥接模式的类图结构:

我们再来看看桥接模式的使用场景,在以下情况下应当使用桥接模式:

  1. 如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系。
  2. 设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的。
  3. 需要跨越多个平台的图形和窗口系统上。
  4. 一个类存在两个独立变化的维度,且两个维度都需要进行扩展。

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桥接模式的更多相关文章

  1. js --桥接模式

    定义: 将抽象部分与它的实现部分分离,使他们都可以独立的变化. 也就是说,桥接模式里面有两个角色: - 扩充抽象类 - 具体实现类 在写桥接模式之前,想在写一下关于抽象的理解.我觉得抽象这个概念过于抽 ...

  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. 关于JAVA中String类型的最大长度

    前些天看到一道面试题,题目很容易理解:String的长度限制是多少? 针对这个题目,浏览了网友的回答,大概得到了3个层次的答案. 最浅的层次: 近似计算机内存大小的长度.这是作为一个程序员最浅显的回答 ...

  2. 路径 php中'.'和'..'还有'./'和'../'

    ./当前目录(就是当前执行文件所在目录) ../上级目录 / 这个才是根目文件名/ 同级目录 例子如图 1.cart下的index.php 1)要引用Public->css->index. ...

  3. [BZOJ3551]Peaks

    [BZOJ3551]Peaks BZOJ luogu 建Kruskal重构树,点权为边权 按dfn序建出主席树 倍增找到能跳到的最浅的祖先 主席树查询一下 #include<bits/stdc+ ...

  4. JS+PHP瀑布流效果

    miai.php,代码如下: $link = mysql_connect("localhost","root",""); //连接数据库 $ ...

  5. Django模型中OneToOneField和ForeignKey的区别

    网上看到一篇讲解"Django模型中OneToOneField和ForeignKey区别" 的文章,浅显易懂; 可以把ForeignKey形象的类比为: ForeignKey是on ...

  6. 启动hive --service metastore &出现Missing Hive Execution Jar: /opt/apache-hive-1.2.0-bin//lib/hive-exec-*.jar

    原因:出现上述问题通常是运行hive 在bin/目录下的脚本所致. 解决办法:就是让HIVE_HOME变量指向hive-trunk/build/dist目录,将$HIVE_HOME/bin添加到PAT ...

  7. 017-Spring Boot AOP

    一.概述 面向切面编程,将业务代码与处理琐碎相关度少的代码隔离开.以便达到重用,解耦. 用途:日志记录.权限处理.性能统计.监控.事务处理.异常处理等 通知类型有:前置通知.后置最终通知.后置返回通知 ...

  8. 20171104 DOI Excel 导出

    1. OAOR 创建模板, Class name:SOFFICEINTEGRATIONClass type:  OTObject key:  ZZCSDRP_0030 2.双击表模板创建Excel 模 ...

  9. 2.2 使用ARDUINO控制MC20发短信

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  10. 剑指offer 面试32题

    面试32题: 题目:从上到下打印二叉树 题:不分行从上到下打印二叉树 解题代码: # -*- coding:utf-8 -*- # class TreeNode: # def __init__(sel ...