桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。
桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。
Bridge接口:
package com.Geeksun.bridge;
public interface Bridge {
void destination();
}
Bridge实现类
package com.Geeksun.bridge;
public class BridgeA implements Bridge {
@Override
public void destination() {
System.out.println("to A place");
}
}
package com.Geeksun.bridge;
public class BridgeB implements Bridge {
@Override
public void destination() {
System.out.println("to B place");
}
}
package com.Geeksun.bridge;
public class BridgeC implements Bridge {
@Override
public void destination() {
System.out.println("to C place");
}
}
Area(出发地)抽象类及子类
package com.Geeksun.bridge;
public abstract class Area {
protected Bridge bridge;
abstract void fromArea();
}
class Area1 extends Area{
public Area1(Bridge bridge){
this.bridge = bridge;
}
@Override
void fromArea() {
System.out.println("from 1");
bridge.destination();
}
}
class Area2 extends Area{
public Area2(Bridge bridge){
this.bridge = bridge;
}
@Override
void fromArea() {
System.out.println("from 2");
bridge.destination();
}
}
class Area3 extends Area{
public Area3(Bridge bridge){
this.bridge = bridge;
}
@Override
void fromArea() {
System.out.println("from 3");
bridge.destination();
}
}
Client
package com.Geeksun.bridge;
public class Client {
public static void main(String[] args) {
Area area = new Area1(new BridgeB());
area.fromArea();
}
}
运行结果:
from 1 to B place
如何,只要你认真看完了实例,你就明白了这种模式的好处,现在我们要添加来源地和目的地,只要继续继承AreaA和实现Qiao即可,之前我所说的绑定,正式此处将桥与目的地绑定在一起,使用一个接口完成。
其实要完成桥接模式,注意点并不多,重在理解模式的使用场景。
注意点:
1、定义一个桥接口,使其与一方绑定,这一方的扩展全部使用实现桥接口的方式。
2、定义一个抽象类,来表示另一方,在这个抽象类内部要引入桥接口,而这一方的扩展全部使用继承该抽象类的方式。
其实我们可以发现桥接模式应对的场景有方向性的,桥绑定的一方都是被调用者,属于被动方,抽象方属于主动方。
其实我的JDK提供的JDBC数据库访问接口API正是经典的桥接模式的实现者,接口内部可以通过实现接口来扩展针对不同数据库的具体实现来进行扩展,而对外的仅仅只是一个统一的接口调用,调用方过于抽象,可以将其看做每一个JDBC调用程序(这是真实实物,当然不存在抽象)
下面来理解一下开头的概念:
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
理解:此处抽象化与实现化分别指代实例中的双方,而且实现化对应目的地方(通过实现桥接口进行扩展),抽象方对应来源地方(通过继承抽象类来进行扩展),如果我们不使用桥接模式,我们会怎么想实现这个实例呢?很简单,我们分别定义来源地A1、A2、A3类和目的地B1、B2、B3,然后具体的实现就是,A1到B1一个类,A1到B2一个类,等,如果我们要扩展了A和B ,要直接增加An类和Bn类,如此编写不说类内部重复性代码多,而且还会导致类结构的急剧膨胀,最重要的是,在通过继承实现路径的时候,会造成双方耦合性增大,而这又进一步加剧了扩展的复杂性。使用桥结构模式可以很好地规避这些问题:重在解耦。