持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情。
桥接模式
简介
桥接模式(Bridge)将事物抽象和其具体实现分开,使事物之间各自可以独立变化,这样在一定程度上可以松耦合,使得程序扩展性更好。使用组合代替继承。这种设计模式属于结构型模式。
桥接模式适用于一个业务存在多个变化维度的场景,桥接模式在其中充当着一个桥梁,通过这个桥梁建立两个类之间的联系,这里摒弃继承使用组合,符合合成复用原则,在一定程度上避免子类爆炸的危害性。
实现
定义抽象接口
public interface ISource {
/**
* 抽象方法method1()
*/
void method1();
}
两个实现类:
public class Source1 implements ISource{
@Override
public void method1() {
System.out.println(this.getClass().getName());
}
}
public class Source2 implements ISource{
@Override
public void method1() {
System.out.println(this.getClass().getName());
}
}
定义一个抽象桥接器:
在此需要将Source组合进来,并提供setter和getter方法。
@Getter
@Setter
public abstract class AbstractBridge {
/**
* 在抽象层将ISource组合进来,并提供getter和setter方法
*/
private ISource source;
public void method(){
source.method1();
}
}
具体桥接器类:
在此可以做一些扩展。
public class MyBridge1 extends AbstractBridge{
/**
* 根据设置的Isource执行对应方法
*/
@Override
public void method(){
System.out.println("MyBridge1");
super.method();
}
}
public class MyBridge2 extends AbstractBridge{
/**
* 根据设置的Isource执行对应方法
*/
@Override
public void method(){
System.out.println("MyBridge2");
super.method();
}
}
测试:
@Test
public void test(){
AbstractBridge myBridge = new MyBridge1();
//执行Source1的方法
myBridge.setSource(new Source1());
myBridge.method();
//执行Source2的方法
myBridge.setSource(new Source2());
myBridge.method();
System.out.println("======================");
AbstractBridge myBridge2 = new MyBridge2();
//执行Source1的方法
myBridge2.setSource(new Source1());
myBridge2.method();
//执行Source2的方法
myBridge2.setSource(new Source2());
myBridge2.method();
}
对于ISource和AbstractBridge这样存在多个变化维度的业务可以使用桥接模式实现。
桥接模式在java中的应用
java中对于数据库驱动的管理使用的就是桥接模式。JDBC进行数据库连接的时候,可以快速的切换,并且不用改动代码,原因就是Java提供统一的数据库驱动接口Driver,各大厂商去实现此接口,在使用的时候将对应数据库驱动注册进来就可以。
目前我们使用的是jdk提供的驱动管理类DriverManager,但是之后关于各种数据库驱动DBCP、c3p0、Druid其对于数据库连接的管理肯定也是遵循一定的规范,这样的场景下数据库驱动和对于链接的管理存在两个维度的变化也是适合桥接模式。
桥接模式&适配器模式
相同点
桥接模式和适配器模式都是为了让两个东西配合一起工作
不同点
适配器模式,改变已有的两个接口,让他们相容。适配器模式要求源对象可以通过目标接口的引用调用。
桥接模式,对于两个对象是否需要实现同一接口不做要求。
适配器模式,一般在两个东西都已经存在了,需要适配才会使用适配器模式,一般存在项目后期。
桥接模式,一般在两个东西都不存在,在项目开始设计的时候将可拓展性考虑进来。