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): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...
随机推荐
- Bean\Entity\Model\POJO\Dto\EJB简单解析
一.Bean 对于Bean而言,只要是Java的类的就可以称为一个Bean, 更用在Spring上,被Spring管理的对象就可以将其称作为Bean. 它不仅仅可以包括对象的属性以及get,set方法 ...
- 使用QFile进行文件操作(QFile可以使用FILE *指针,还必须指定AutoCloseHandle)
QFile类我我们提供了操作文件的常用功能.它是一种io设备,可以用来读写文本文件和二进制文件,也可以用来读写Qt的资源文件.QFile类可以单独使用,该类本身提供了read/write函数,但更方便 ...
- python并发编程&多线程(一)
本篇理论居多,实际操作见: python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...
- python基本数据类型之操作
python注释 当行注视:# 被注释内容多行注释:""" 被注释内容 """ 字符串操作 # 代表单行注释 ...
- Matlab mser(最大极值稳定区域)
在Matlab R2013a 和R2014a中已经实现MSER特征的提取. 一.函数detectMSERFeatures 输入的是M*N的灰度图片.可以指定阈值刻度,区域范围,感兴趣区域等参数. 输出 ...
- 升级到tomcat8遇到The method getDispatcherType() is undefined for the type HttpServletRequest
今天升级到tomcat8,发现原来的项目不能运行了,遇到下面的错误:The method getDispatcherType() is undefined for the type HttpServl ...
- 剑指offer 面试15题
面试15题: 题目:二进制中1的个数 题:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路一: 最佳方法:把一个整数减去1,再和原整数做“与运算”,会把该整数最右边的1变成0 ...
- C#使用Lock访问共享数据的问题
lock 语句(C# 参考) lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁.此语句的形式如下: 复制 Object thisLock = new Objec ...
- python之网络socket编程
一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...
- Yii2.0数据库查询实例(三)
常用查询: // WHERE admin_id >= 10 LIMIT 0,10 User::find()->])->offset()->limit()->all() / ...