上图为多重继承模式,类的个数比较多,扩展比较麻烦; 下图为抽象出两个纬度,减少类的构建:
//1.品牌纬度 --------------- 接口:电脑品牌 ---------------
public interface Brand {
void brandName();
}
//联想品牌
public class Lenovo implements Brand {
@Override
public void brandName() {
System.out.print("联想品牌");
}
}
//苹果品牌
public class Apple implements Brand {
@Override
public void brandName() {
System.out.print("苹果品牌");
}
}
//2.种类纬度 --------------- 抽象类:电脑种类 ---------------
public abstract class Computer {
//通过组合的方式,给电脑增加上品牌属性
protected Brand brand;
//构造器中,引入品牌(出厂自带品牌)
public Computer(Brand brand) {
this.brand = brand;
}
//输出电脑信息:品牌 + 种类
abstract void computerInfo();
}
//笔记本
public class NoteBook extends Computer {
public NoteBook(Brand brand) { super(brand); }
@Override
void computerInfo() {
brand.brandName();
System.out.println("笔记本");
}
}
//平板
public class Flat extends Computer {
public Flat(Brand brand) { super(brand); }
@Override
void computerInfo() {
brand.brandName();
System.out.println("平板");
}
}
//3. ----------- 测试 ------------
public static void main(String[] args) {
//苹果笔记本
Computer computer = new NoteBook(new Apple());
computer.computerInfo();
//联想平板
Computer computer2 = new Flat(new Lenovo());
computer2.computerInfo();
}
输出结果:
苹果品牌笔记本
联想品牌平板
优点:
桥接模式偶尔类似于多重继承方案。但多重继承违背了单一职责原则,类的个数非常多。桥接模式抽象出不同纬度,可以减少子类的个数,降低管理和维护成本
桥接模式符合开闭原则,提高系统的可扩充性。如上面例子,两个纬度任意变化,都不需要修改原系统。就像一座桥,(通过组合)把两个纬度连接起来
缺点
桥接模式增加系统的理解与设计难度。聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
桥接模式要求正确识别出系统中两个独立变化的纬度,使用范围有局限性
最佳实践
如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
场景
- Java语言通过Java虚拟机实现了平台的无关性。
- AWT中的Peer架构
- JDBC驱动程序也是桥接模式的应用之一
评论
登录后才可以进行评论哦!