《设计模式》设计模式的基本原则
《设计模式》单例模式
《设计模式》工厂模式
《设计模式》原型模式
《设计模式》建造者模式
《设计模式》适配器模式
《设计模式》桥接模式
《设计模式》装饰者模式
《设计模式》组合模式
《设计模式》外观模式
《设计模式》享元模式
《设计模式》代理模式
《设计模式》模板方法模式
《设计模式》命令模式
桥接模式的注意事项:
桥接模式的 UML 类图如下所示:
从 UML 图可以看出,抽象类和接口是聚合的关系,其实也是调用和被调用的关系。
现有一个需求,需要对不同手机类型的不同品牌实现操作(开关机、上网、打电话)进行编程。使用传统方式解决该问题,分析其 UML 类图如下所示:
使用传统方式解决这个问题时,有一个缺点即扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,如果要增加一个手机品牌也需要在各个手机样式类下增加。
因此,为了克服这个缺点,决定使用桥接模式改进传统方式,让程序具有更好的扩展性有利于程序维护,其 UML 类图分析如下所示:
Brand
接口
public interface Brand {
void open();
void close();
void call();
}
类 Phone
public abstract class Phone {
private Brand brand;
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
brand.open();
}
protected void close() {
brand.close();
}
protected void call() {
brand.call();
}
}
类 UpRight
public class UpRight extends Phone{
public UpRight(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("打开直立式手机");
}
@Override
public void close() {
super.close();
System.out.println("关闭直立式手机");
}
@Override
public void call() {
super.call();
System.out.println("直立式手机呼叫");
}
}
手机类 A
,类 B 同理
public class A implements Brand {
@Override
public void open() {
System.out.println("A手机开机");
}
@Override
public void close() {
System.out.println("A手机关机");
}
@Override
public void call() {
System.out.println("A手机呼叫");
}
}
类 Client
public class Client {
public static void main(String[] args) {
Phone phone = new UpRight(new A());
phone.open();
}
}
此外,桥接模式在 JDBC 源码中也有应用,JDBC 的 Driver 接口,下面有 MySQL、Oracle 的 Driver 接口实现类。