今天我们继续学习23种设计模式中的桥接模式。所谓桥接模式就是将抽象部分和实现部分隔离开来,使得它们能够独立变化。桥接模式将继承关系转化成关联关系,封装了变化,完成了解耦,减少了系统中类的数量,也减少了代码量。
概念:
桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
如果说某个系统能够从多个角度来进行分类,且每一种分类都可能会变化,那么我们需要做的就是将这多个角度分离出来,使得它们能独立变化,减少他们之间的耦合,这个分离过程就使用了桥接模式。
特点:
优点:
- 抽象与实现分离,所以扩展性好
- 实现细节对客户透明
缺点:
- 由于聚合关系建立在抽象层,要求开发者针对抽象层进行设计与编程,这增加了系统的理解与设计难度。
类图分析:
代码:
手机品牌接口
package cn.ppdxzz.bridge;
/**
* Description:手机品牌接口
* @Author: PeiChen JavaAnything
*/
public interface Brand {
void open(); //开机
void call(); //打电话
void close(); //关机
}
OPPO品牌的手机
package cn.ppdxzz.bridge;
/**
* Description:OPPO品牌的手机
* @Author: PeiChen JavaAnything
*/
public class Oppo implements Brand {
@Override
public void open() {
System.out.println("oppo手机开机");
}
@Override
public void call() {
System.out.println("oppo手机打电话");
}
@Override
public void close() {
System.out.println("oppo手机关机");
}
}
vivo品牌的手机
package cn.ppdxzz.bridge;
/**
* Description:vivo品牌的手机
* @Author: PeiChen JavaAnything
*/
public class Vivo implements Brand {
@Override
public void open() {
System.out.println("vivo手机开机");
}
@Override
public void call() {
System.out.println("vivo手机开机");
}
@Override
public void close() {
System.out.println("vivo手机开机");
}
}
手机抽象类
package cn.ppdxzz.bridge;
/**
* Description:手机抽象类
* @Author: PeiChen JavaAnything
*/
public abstract class Phone {
//品牌注入到手机中
private Brand brand;
public Phone() {
}
public Phone(Brand brand) {
this.brand = brand;
}
protected void open() {
brand.open();
}
protected void call() {
brand.call();
}
protected void close() {
brand.close();
}
}
触摸式手机
package cn.ppdxzz.bridge;
/**
* Description:触摸式手机
* @Author: PeiChen JavaAnything
*/
public class TouchPhone extends Phone {
public TouchPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("触摸式手机");
}
@Override
public void call() {
super.call();
System.out.println("触摸式手机");
}
@Override
public void close() {
super.close();
System.out.println("触摸式手机");
}
}
折叠式手机
package cn.ppdxzz.bridge;
/**
* Description:折叠式手机
* @Author: PeiChen JavaAnything
*/
public class FoldedPhone extends Phone {
public FoldedPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("折叠式手机");
}
@Override
public void call() {
super.call();
System.out.println("折叠式手机");
}
@Override
public void close() {
super.close();
System.out.println("折叠式手机");
}
}
成品手机
package cn.ppdxzz.bridge;
/**
* Description:桥接模式(手机不同样式不同品牌的案例)
* @Author: PeiChen JavaAnything
*/
public class Client {
public static void main(String[] args) {
System.out.println("(=====oppo品牌的手机=====)");
Phone phone1 = new TouchPhone(new Oppo());
phone1.open();
phone1.call();
phone1.close();
System.out.println("(=====vivo品牌的手机=====)");
Phone phone2 = new FoldedPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
}
}
演示:
桥接模式在 JDBC 中的源码分析
分析:
JDBC 中的 Driver 接口,如果从桥接模式来看,Driver 就是一个接口,下面可以有 MySQL 的 Driver,Oracle 的 Driver,这些就可以当做实现接口类。Driver 和 Connection 之间通过 DriverManager 桥接。
总结:
- 桥接模式使抽象和实现的进行分离,极大的提高了系统的灵活性,这有助于系统进行分层设计,从而产生更好的结构化系统。
- 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
桥接模式的讲解就先到这里,另外桥接模式要求正确识别出系统中两个独立变化的维度(抽象和实现),因此其使用范围具有一定的局限性。