Java结构型模式之桥接模式详解
作者:非凡的小笨鱼
桥接模式是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过桥接模式将这两个维度分离出来,使两者可以独立扩展
一.介绍
桥接模式(Bridge Pattern)属于结构型模式。用于将抽象与其实现解耦,使得二者可以独立变化。桥接模式使用组合/聚合替代继承,从而连接功能层面与实现层面,把强关联转为弱关联之后进行双向扩展
适配器模式可以在抽象层不变的情况下,对实现进行扩展和变化;而桥接模式可以在抽象和实现两个维度独立扩展和变化
二.场景理解
JPA是ORM框架的抽象,或者说是Java提供的持久化标准,而Hibernate与TopLink则是ORM框架的具体实现,而在Hibernate框架下,又有针对一系列数据库厂商的具体实现,图中是以继承的方式表现Hibernate、TopLink框架下不同数据库厂商的行为变化
上图我们将ORM框架数记为N,将数据库厂商数记为M,如果要新增一个ORM框架,就会生成M个子类,如果新增了一个数据库厂商,就要新增N个子类,两个维度不能够独立的进行扩展,而且最终子类的个数是N*M,代码复杂度会指数型增长,可能会造成类爆炸
JDBC是Java提供的访问关系型数据库的一套标准,根据合成复用原则(组合/聚合优先于继承),在JPA中组合了不同数据库厂商的抽象,此时就在功能层面和实现层面建立起了一座桥梁,无论是ORM框架个数还是数据库厂商的个数都可以进行独立的扩展了,而最终子类的个数仅是N+M
三.UML类图
四.具体代码
业务代码
//抽象化角色 public abstract class JPA { protected JDBC jdbc; protected JPA(JDBC jdbc) { this.jdbc = jdbc; } public abstract void insert(); } //扩展抽象化角色 class Hibernate extends JPA{ protected Hibernate(JDBC jdbc) { super(jdbc); } @Override public void insert() { System.out.println("Hibernate环境"); jdbc.insert(); } } //扩展抽象化角色 class TopLink extends JPA{ protected TopLink(JDBC jdbc) { super(jdbc); } @Override public void insert() { System.out.println("TopLink环境"); jdbc.insert(); } } interface JDBC{ void insert(); } //具体实现化角色 class MySQL implements JDBC{ @Override public void insert() { System.out.println("MySQL执行新增操作"); } } //具体实现化角色 class Oracle implements JDBC{ @Override public void insert() { System.out.println("Oracle执行新增操作"); } }
客户端
public class Client { public static void main(String[] args) { //数据库厂商 JDBC jdbc = new MySQL(); //ORM框架 JPA jpa = new Hibernate(jdbc); jpa.insert(); } }
五.优缺点
优点
- 符合开闭原则
- 符合合成复用原则
- 抽象与实现分离,扩展能力极强
缺点
- 组合/聚合关系建立在抽象层,增加系统的理解与设计难度
六.使用场景
- 当一个系统存在两个独立变化的维度,且这两个维度都需要进行扩展
- 当一个系统不希望使用继承或因为多层次继承导致类的个数急剧增加
到此这篇关于Java结构型模式之桥接模式详解的文章就介绍到这了,更多相关Java桥接模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!