设计模式,写代码必备神器...

桥接模式是什么?

桥接模式是把抽象化和实现化解耦,让两者能够独立,该设计模式属于结构性设计模式。何为将抽象化和实现化解耦,能够了解为将性能点形象进去,性能的实现如何取决于不同的需要,然而形象的性能点(接口)曾经被桥接到本来的类型上,只用关注与实现。本来的类型变动,和形象的性能点能够自在变动,两头的桥梁曾经搭建起来了

桥接模式其实就是不单单应用类继承的形式,而是重点应用类聚合的形式,进行桥接,把形象的性能点,聚合(注入)到基类外面。

桥接模式的益处

个别用于解决什么问题呢?

次要是性能点实现品种多,多个维度的性能点,独立变动,没有什么关联,能够依照维度来治理。比方有 2 个维度,每个维度有 3 种实现,然而不同的维度之间其实没有关联,如果依照维度之间两两关联来搞,单单是实现类的数量就曾经2 * 3 = 6个类了,是在不太适合,还耦合在一块。

用电脑举个例子,既会分成不同的品牌,比方戴尔,联想,又会分为台式机,笔记本,那么不同的类就会很多,性能可能比拟反复。正是鉴于这一点,咱们得剥离反复的性能,用桥接的形式,来保护形象进去的独特性能点。

如果再新增一个品牌,比方,华硕,那么又得减少两个类,这显著不太适合,不同的类很多性能可能会反复。

那么桥接模式怎么解决呢?桥接模式把两个不同的维度 台式机笔记本抽取进去,相当于作为一个通用的属性来保护。

代码Demo演示

首先,定义一个形象的电脑类AbstractComputer,在其中有一个属性是ComputerType,示意电脑的类型:

public abstract class AbstractComputer {    protected ComputerType type;    public void setType(ComputerType type) {        this.type = type;    }    public abstract void work();}

再定义三种类型的电脑:LenovoComputer,AsusComputer,DellComputer:

public class LenovoComputer extends AbstractComputer{    @Override    public void work() {        System.out.print("联想");        type.feature();    }}
public class AsusComputer extends AbstractComputer{    @Override    public void work() {        System.out.print("华硕");        type.feature();    }}
public class DellComputer extends AbstractComputer{    @Override    public void work() {        System.out.print("戴尔");        type.feature();    }}

电脑类型这个维度同样须要一个抽象类ComputerType,外面有一个阐明性能的办法feature():

public abstract class ComputerType {    // 性能个性    public abstract void feature();}

电脑类型这个维度,咱们定义台式机和笔记本电脑两种:

public class DesktopComputerType extends ComputerType{    @Override    public void feature() {        System.out.println(" 台式机:性能弱小,拓展性强");    }}
public class LaptopComputerType extends ComputerType{    @Override    public void feature() {        System.out.println(" 笔记本电脑:玲珑便携,办公不在话下");    }}

测试一下,咱们须要不同的搭配的时候,只须要将一个维度set到对象中去即可,就能够聚合出不同品牌不同类型的电脑:

public class BridgeTest {    public static void main(String[] args) {        ComputerType desktop = new DesktopComputerType();        LenovoComputer lenovoComputer = new LenovoComputer();        lenovoComputer.setType(desktop);        lenovoComputer.work();        ComputerType laptop = new LaptopComputerType();        DellComputer dellComputer = new DellComputer();        dellComputer.setType(laptop);        dellComputer.work();    }}

测试后果:

联想 台式机:性能弱小,拓展性强戴尔 笔记本电脑:玲珑便携,办公不在话下

总结一下

桥接模式,实质上就是将不同维度或者说性能,形象进去,作为属性,聚合到对象外面,而不是通过继承。这样肯定水平上缩小了类的数量,然而如果不同的维度之间,变动是相关联的,这样应用起来还须要再做各种非凡判断,应用起来容易造成凌乱,不宜应用。(重点:用组合/聚合关系代替继承关系来实现

JDBC,搞过Java的同学应该都晓得,这是一种Java对立拜访数据库的API,能够操作Mysql,Oracle等,次要用到的设计模式也是桥接模式,有趣味能够理解一下Driver驱动类治理的源码。

【作者简介】
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使迟缓,驰而不息。集体写作方向:Java源码解析JDBCMybatisSpringredis分布式剑指OfferLeetCode等,认真写好每一篇文章,不喜爱题目党,不喜爱花里胡哨,大多写系列文章,不能保障我写的都完全正确,然而我保障所写的均通过实际或者查找材料。脱漏或者谬误之处,还望斧正。

剑指Offer全副题解PDF

开源编程笔记