定义
桥接模式是将抽象部分与它的实现部分分离, 使他们都可以独立地变化, 它是一种对象结构型模式, 又称为柄体(Handle and Body)模式或接口(Interface)模式。
分析:**
这个场景中有两个变化的维度: 品牌—— 类型
优缺点
优点:
- 实现了抽象和实现部分的分离:桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统;
- 更好的可扩展性 :抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性;
可动态切换实现 : 由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
缺点:
桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
适用场景
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;
- 不希望或不适用使用继承的场景,可以考虑用桥接模式
- 接口或抽象类不稳定的场景,可以考虑用桥接模式
- 重用性要求较高的场景,可以考虑用桥接模式
应用实例:
(1)开关。我们可以看到的开关是抽象的,不用管里面具体怎么实现;
(2)手机品牌与手机软件。两者间有一条聚合线,一个手机品牌可以有多个手机软件。
不要一涉及继承就考虑该模式,尽可能把变化的因素封装到最细、最小的逻辑单元中,避免风险扩散
桥接模式实现方法
Brand 品牌
//品牌
public interface Brand {
void info();
}
Lenovo/Apple/Daire
//联想品牌
public class Lenovo implements Brand {
@Override
public void info() {
System.out.print("联想");
}
}
-------------------------------------------
//苹果品牌
public class Apple implements Brand {
@Override
public void info() {
System.out.print("苹果");
}
}
-------------------------------------------
//戴尔品牌
public class Apple implements Brand {
@Override
public void info() {
System.out.print("戴尔");
}
}
Computer 电脑
//抽象的电脑类型类
public abstract class Computer {
//组合,品牌~
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void info() {
brand.info();//自带品牌
}
}
-------------------------------------------------
class Desktop extends Computer {
public Desktop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.print("台式机");
}
}
-------------------------------------------------
class Laptop extends Computer {
public Laptop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.print("笔记本");
}
}
------------------------------------------------
class Pad extends Computer {
public Laptop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.print("平板");
}
}
测试
public class Test {
public static void main(String[] args) {
//苹果管记本
Computer computer = new Laptop(new Apple());
computer.info();
System.out.println();
//联想台式机
Computer computer2 = new Desktop(new Lenovo());
computer2.info();
}
}
JDBC中的桥接模式
使用JCBC的时候,一直很困惑获取connection的过程和原理,为什么把不同的数据库驱动名称放到Class.forName()中就能获取到对应的数据库连接呢?
Oracle为例,通过Class.forName(“oracle.jdbc.OracleDriver”)类加载的时候执行静态代码块将Driver注册到DriverManager,DriverManager是个Driver容器,管理不同的Driver,这样具体的数据Driver实现就统一交给容器管理,客户端通过DriverManager执行验证连接,获取连接的操作。