提及桥接模式可能你们都多少以为名字陌生,可是若是说解耦以及封装功能函数你们必定都不陌生,其实在咱们写业务代码时已经在无形中多少使用这种设计模式了,只是没有注意到或者养成习惯要这样设计。javascript
桥接模式的主要特色就是将实现层与抽象层解耦分离,使得两部分独立变化。由此能够看出桥接模式主要是对结构之间的解耦,而抽象工厂模式和建立模式主要任务在于建立。java
好比咱们须要在一个业务中原来的代码是这样的,代码很是简单,只是说明其思想是什么。编程
// old codes
let addNum = 5 ;
let total = initNum + addNum ;
let amount = 100 + addNum;
console.log(`增长了${addNum}件衣服`);
// extra codes
let addNum = 9 ;
let total = initNum + addNum ;
let amount = 100 + addNum;
console.log(`增长了${addNum}件鞋子`);
//better codes 提取代码中的共同点,为公共函数,与具体的业务解耦,而后在原来的不一样页面中分别调用
function addObjs(addnum,name){
let total = initNum + addNum ;
let amount = 100 + addNum;
console.log(`增长了${addNum}`件${name});
}
let addNum = 5;
addObjs(addNum,'衣服');
let addNum = 9;
addObjs(addNum,'鞋子');
复制代码
除了上面这种使用,其实多维的变化也是很是常见的使用场景。与上面解耦抽象与具体业务不一样,这时的桥接是能够看作是用于组合不一样的基本抽象类或者方法,而后组装成另外一个对象或者类。设计模式
假设咱们具备人这个类,可是后面发现人的类代码写多了会有两种场景困扰咱们须要重构。函数
这时候,咱们就会用桥接模式将不一样的函数或者类桥接以后做为一个新的总体使用.工具
codepen代码地址:连接性能
class Animal{
constructor(name){
this.name = name || 'animal';
}
run(){
console.log(`${this.name} can run`)
}
}
function talk(){
console.log('talk in xx language')
}
function work(name){
console.log(`${name} can work`)
}
class Person{
constructor(name){
this.name = name ;
this.animal = new Animal(this.name);
this.talk = talk ;
this.work = work.bind(this,this.name) ;
}
}
let zhangsan = new Person('张三');
zhangsan.work();
zhangsan.talk();
zhangsan.animal.run();
复制代码
桥接模式会形成开发成本的增长,有时性能也会受到影响,请合理的平衡决定是否使用。学习
在另外的章节,我会着重分析学习面对对象的继承编程和组合编程的差异。ui
原文连接:桥接模式this