前言
说起桥接模式可能大家都多少觉得名字陌生,但是如果说解耦以及封装功能函数大家一定都不陌生,其实在我们写业务代码时已经在无形中多少使用这种设计模式了,只是没有注意到或者养成习惯要这样设计。
桥接模式的主要特点就是将实现层与抽象层解耦分离,使得两部分独立变化。由此可以看出桥接模式主要是对结构之间的解耦,而抽象工厂模式和创建模式主要任务在于创建。
案例说明
案例一 解耦抽象出工具类(抽象类)
比如我们需要在一个业务中原来的代码是这样的,代码非常简单,只是说明其思想是什么。
// 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();复制代码
更多
桥接模式会造成开发成本的增加,有时性能也会受到影响,请合理的平衡决定是否使用。
在另外的章节,我会着重分析学习面对对象的继承编程和组合编程的差别。
原文链接: