设计模式之桥接模式JavaScript实现方式1

1.意图

将抽象部分和与它的实现部分分离,使它们都可以独立地变化。

2.别名

Handle/Body

3.动机

当一个抽象可能有多个实现的时,通常用继承来协调它们。抽象类定义对该抽象的接口而具体的子类则用不同的方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地修改,扩充和重用。


简明的说如上图:

1.桥接模式就是要实现A1可以通过桥桥接到B1也可以桥接到B2,形成一个整体供客户端调用,A2可以通过桥桥接到B1也可以桥接到B2,形成一个整体供客户端调用

2.由于有了这座桥,使得桥两边的随着两端不同的维度进行变化,同时两端的事物又通过桥存在着一定的联系。

类图:


示例代码:

/**
 * Created by yangy on 2017/5/8.
 */
function  Phone(name) {
  this.name=name;
}
Phone.prototype.connectImpl=function () {

}
function SamsungPhone(name) {
  Phone.call(this,name);
}
SamsungPhone.prototype=Object.create(Phone.prototype);
SamsungPhone.prototype.constructor=SamsungPhone;
SamsungPhone.prototype.connectImpl=function () {
  console.log("连接上了"+this.name);
}
function XiaomiPhone(name) {
  Phone.call(this,name);
}
XiaomiPhone.prototype=Object.create(Phone.prototype);
XiaomiPhone.prototype.constructor=XiaomiPhone;
XiaomiPhone.prototype.connectImpl=function () {
  console.log("连接上了"+this.name);
}
function Computer(phone,computerName) {
  this.phone=phone;
  this.computerName=computerName;
}
Computer.prototype.connect=function () {
}
function ASUSComputer(phone,computerName){
  Computer.call(this,phone,computerName);
}
ASUSComputer.prototype=Object.create(Computer.prototype);
ASUSComputer.prototype.constructor=ASUSComputer;
ASUSComputer.prototype.connect=function () {
  console.log(this.computerName);
  this.phone.connectImpl();
}
function DellComputer(phone,computerName){
  Computer.call(this,phone,computerName);
}
DellComputer.prototype=Object.create(Computer.prototype);
DellComputer.prototype.constructor=DellComputer;
DellComputer.prototype.connect=function () {
  console.log(this.computerName);
  this.phone.connectImpl();
}
function Person(computer,name) {
  this.computer=computer
  this.name=name
}
Person.prototype.useComputer=function () {

}
function Student(computer,name){
  Person.call(this,computer,name);
}
Student.prototype=Object.create(Person.prototype);
Student.prototype.constructor=Student;
Student.prototype.useComputer=function () {
  console.log(this.name+"使用");
  this.computer.connect();
}
function Teacher(computer,name){
  Person.call(this,computer,name);
}
Teacher.prototype=Object.create(Person.prototype);
Teacher.prototype.constructor=Teacher;
Teacher.prototype.useComputer=function () {
  console.log(this.name+"使用");
  this.computer.connect();
}

// # 华硕电脑连接上了三星手机B1
var ASUScomputer = new ASUSComputer(new SamsungPhone('三星手机B1'), '华硕电脑A1')
ASUScomputer.connect()
// # 戴尔电脑连接上了三星手机B1
var dellcomputer=new DellComputer(new SamsungPhone('三星手机B1'), '戴尔电脑B1')
dellcomputer.connect()
// # 戴尔电脑连接上了小米手机A1
var dellcomputer = new DellComputer(new XiaomiPhone('小米手机A1'), '戴尔电脑B1')
dellcomputer.connect()
// # 学生A1使用华硕电脑A1连接上了小米手机A1
var student=new Student(new ASUSComputer(new XiaomiPhone('小米手机A1'),'华硕电脑A1'),'学生A1')
student.useComputer()
// # 老师B1使用戴尔电脑B1连接上了三星手机B1
var teacher=new Teacher(new DellComputer(new SamsungPhone('三星手机B1'), '戴尔电脑B1'), '老师B1')
teacher.useComputer()


4.适用性

1.不希望在抽象和它的实现部分之间有一个固定的绑定关系。列如在程序运行时刻实现部分应可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类方法加以扩充。这时的桥接模式使你可以不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

4.想对客户完全隐藏抽象的实现部分。

5.有许多类要生成,类的层次结构说明你必须得将一个对象分解成两个部分。

6.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

5.优缺点

优点

1.分离抽象接口及其实现部分。 

桥接模式有时类似于多继承方案,但是多继承方案违背了类  

  的单一职责原则,复用性比较差,而且多继承结构中类的个数非

  常庞大,桥接模式是比多继承方案更好的解决方法。

2.桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一

  个维度,都不需要修改原有系统。 

3.实现细节对客户透明,可以对用户隐藏实现细节。 

缺点

1.桥接模式的引入会增加系统的理解与设计难度,由

  于聚合关联关系建立在抽象层,要求开发者针对抽 

  象进行设计与编程。

2.桥接模式要求正确识别出系统中两个独立变化的维

  度,因此其使用范围具有一定的局限性。 

6.已知应用

1.Java语言通过Java虚拟机实现了平台的无关性

2.JDBC驱动程序也是桥接模式的应用之一。使用JDBC驱动程序的应用系统就是抽象角色,而所使用的数据库是实现角色。

   一个JDBC驱动程序可以动态地将一个特定类型的数据库与一个Java应用程序绑定在一起,从而实现抽象角色与实现角色的动态耦合

7.与其他模式的关系

桥接模式和装饰模式:

这两个模式在一定程度上都可减少子类的数目,避免出现复杂的继承关系,但是它们解决的方法却各有不同,装饰模式把子类中比基类多出来的部分放到单独的类里面,以适应新功能的添加,把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过聚合以实现很多的功能组合。而桥接模式是把两个以上独立的抽象维度分离,使用聚合的方式使其关联,来达到减少子类的目的,结构上桥接模式比装饰模式要复杂。

装饰模式就像中秋节包装过的月饼一样,可以包多层,每一层可以使用不同的包装纸来包装。

桥接模式和适配器模式

它们的共同点是桥接和适配器都是让两个类配合工作,它们的区别是出发点不同,适配器的出发点是改变已有的两个接口,让它们相容,可以结合那些功能上相似但是接口不同的类,桥接模式的出发点是分离抽象化和实现化,是两者的接口可以不同,目的是分离。

        桥接是先有桥,才有两端的东西
        适配是先有两边的东西,才有适配器


        桥接是在桥好了之后,两边的东西还可以变化。

适配器模式通常在系统设计完成之后才会被使用。桥接模式则是在系统开始时就被使用。


桥接模式与抽象工厂模式

抽象工厂模式可以又来创建和配置一个特定的桥接模式

  这两个模式可以组合使用。
    桥接模式中,抽象部分需要获取相应的实现部分的接口对象,可以使用抽象工厂模式来创建和配置一个特定的具体实现的对象。

抽象工厂主要是用来创建一系列对象的,如果创建的对象很少,或者是很简单,还可以采用简单工厂,可以达到一样的效果,但是会比抽象工厂来得简单




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值