桥接模式核心要点:
处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。系统可能有多个角度分类,每一种角度都可能变化。在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 使用桥接模式能把这种多角度分类的实现类分离出来,让它们独立变化,减少它们之间耦合;同时,抽象和实现之间可以独立扩展,不会影响到彼此,也将实现部分与抽象部分分离,使它们都可以独立的变化。
代码示例:
在这里,为了达到通俗易懂的演示效果,将采用生活的案例作为演示。比如我们需要定义一些电脑类,这些类有两个维度:1.品牌,如联系、惠普;2.种类,如手提电脑、台式机。显而易见,采用继承的方式可以实现这个需求,但是会形成一个类似于树形的继承关系,使类与类之间的关系较为繁杂且耦合度高,那么我们可以采用桥接模式的方式来实现这个需求:
首先定义电脑品牌相关的接口和类:
/**
* 品牌
* @author Administrator
*
*/
public interface Brand {
void sale();
}
class Lenovo implements Brand {
@Override
public void sale() {
System.out.println("销售联想电脑");
}
}
class Dell implements Brand {
@Override
public void sale() {
System.out.println("销售Dell电脑");
}
}
class Shenzhou implements Brand {
@Override
public void sale() {
System.out.println("销售神舟电脑");
}
}
然后定义电脑的类型:
/**
* 电脑类型的维度
* @author Administrator
*
*/
public class Computer2 {
protected Brand brand;
public Computer2(Brand b) {
this.brand = b;
}
public void sale(){
brand.sale();
}
}
class Desktop2 extends Computer2 {
public Desktop2(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("销售台式机");
}
}
class Laptop2 extends Computer2 {
public Laptop2(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("销售笔记本");
}
}
可见电脑的父类是持有着品牌接口的引用的,也就意味着只要继承了电脑父类,就通过构造方法能持有品牌接口的引用。
接下来编写mian方法进行调用:
public class Client {
public static void main(String[] args) {
//销售联想的笔记本电脑
Computer2 c = new Laptop2(new Lenovo());
c.sale();
//销售神舟的台式机
Computer2 c2 = new Desktop2(new Shenzhou());
c2.sale();
}
}
运行结果:
销售联想电脑
销售笔记本
销售神舟电脑
销售台式机
这样就能通过持有接口引用的方式进行电脑和品牌的桥接,桥接模式提供了系统的可扩展性,在电脑品牌和种类这两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则,就像一座桥将两岸连接起来,各个岸上都可以独立的变化。
应用实例:
JDBC驱动程序