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): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...
随机推荐
- 关于vue,angularjs1,react之间的对比
1.时间投入的问题:相对于react和angularjs,学习vue的时间成本低,而且容易上手. 2.JSX的可读性比较一般.代码的可读性不如vue,当然,vue也支持jsx,但是vue更提倡temp ...
- linux /etc/security/limits.conf的相关说明
暂时粘贴他人的地址,后续会整理后放出. 原文地址:http://blog.csdn.net/taijianyu/article/details/5976319
- SqlCommand对象-Transaction事务的使用
using (SqlConnection connection = new SqlConnection(connStr)) { SqlCommand sqlcmd = new SqlCommand() ...
- python函数回顾:hex()
描述 hex() 函数用于将10进制整数转换成16进制,以字符串形式表示. 语法 hex 语法: hex(x) 参数说明: x -- 10进制整数 返回值 返回16进制数,以字符串形式表示. 实例 & ...
- Mysql存储引擎的选择
Mysql存储引擎概述 mysql的存储引擎是插件式的,用户可以根据需求选择如何存储和索引数据是否使用事务等. Mysql支持多种存储引擎,用户可以选择不同的引擎来提高应用的效率,灵活的存储方案,存储 ...
- Ubuntu14.04下Nginx反向代理Odoo域名
安装nginx sudo apt-get install -y nginx 修改配置文件 vi /etc/nginx/nginx.conf #注释掉下面这行代码 #include /etc/nginx ...
- linux虚拟机能ping通windows主机,windows主机ping不通linux虚拟机的解决办法
分三步: 1.虚拟机网络连接方式选择Nat
- Python基础-shelve模块
shelve模块会生成test.txt.bak.test.txtdat.test.txt.dir三个文件 import shelve f = shelve.open(r'text.txt') f['} ...
- 剑指offer 面试49题
面试49题: 题:丑数 题目:把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N ...
- Django——admin组件
Django提供了基于web的管理工具. Django自动管理工具是django.contrib的一部分.你可以在项目的settings.py中的INSTALLED_APPS看到它: # Applic ...