桥接模式(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. 巨蟒django之权限10,内容梳理&&权限组件应用

    1.CRM项目内容梳理: 2.权限分配 3.权限组件的应用

  2. JavaScript中对事件简单的理解

    事件(event) 1.什么是JavaScript事件? 事件是文档或浏览器中发生的特定交互瞬间. 2.事件流 事件流描述的是从页面中接受事件的顺序,包含IE提出的事件冒泡流与Netscape提出的事 ...

  3. 关于在python manage.py createsuperuser时报django.db.utils.OperationalError: no such table: auth_user的解决办法

    在stackflow上看到解决的办法是需要进行数据路的migrate:https://stackoverflow.com/questions/39071093/django-db-utils-oper ...

  4. python面向对象(二)

    属性查找 类有两种属性:数据属性和函数属性 1. 类的数据属性是所有对象共享的 2. 类的函数属性是绑定给对象用的 class BeijingStudent:   school='Beijing'  ...

  5. document write & close

    在载入页面后,浏览器输出流自动关闭.在此之后,任何一个对当前页面进行操作的document.write()方法将打开—个新的输出流,它将清除当前页面内容. 必须确保调用document.close() ...

  6. pycharm 用鼠标滚动调整字体大小

  7. 2、Python request、BeautifulSoup(download mm_pic)

    import requests from bs4 import BeautifulSoup import os class DownLoadImg(object): def __init__(self ...

  8. 0201-开始使用Spring Cloud实战微服务准备工作

    1.Spring Cloud是什么 基于spring boot,之上快速构建分布式系统的工具集 服务注册和发现[eureka.Consul.Zookeeper].服务负载均衡[Ribbon,feign ...

  9. boost之时间timer

    C++一直缺乏对时间和日期的处理能力,一般借助于C的struct tm和time():timer包含三个类其中timer,progress_timer是计时器类,进度指示类是progress_disp ...

  10. PyQt4打包exe文件

    使用到工具pyinstaller pip install pyinstaller 使用指令打包,其中xxx.ico为需要的图标,xxx.py为要打包的py文件 pyinstaller -w --ico ...