提及橋接模式可能你們都多少以爲名字陌生,可是若是說解耦以及封裝功能函數你們必定都不陌生,其實在咱們寫業務代碼時已經在無形中多少使用這種設計模式了,只是沒有注意到或者養成習慣要這樣設計。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