桥接模式用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。
抽象化
从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征,就是抽象化。例如苹果、香蕉、生梨、 桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象化的过程。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。共同特征是指那些能把一类事物与他类事物区分开来的特征,这些具有区分作用的特征又称本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。 所以抽象化的过程也是一个裁剪的过程。在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。
通常情况下,一组对象如果具有相同的特征,那么它们就可以通过一个共同的类来描述。如果一些类具有相同的特征,往往可以通过一个共同的抽象类来描述。
实现化:抽象化给出的具体实现,就是实现化。
一个类的实例就是这个类的实例化,一个具体子类是它的抽象超类的实例化。
脱耦
所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
所谓强关联,就是在编译时期已经确定的,无法在运行时期动态改变的关联;所谓弱关联,就是可以动态地确定并且可以在运行时期动态地改变的关联。显然,在Java语言中,继承关系是强关联,而聚合关系是弱关联。
将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
●Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。
●RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。
●Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。
●ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法。
以打印机类为Implementor实现类接口,图形类抽象类,可以选择用彩色打印机和黑白打印机来打印图形。
1.创建打印机类作为Implementor(实现类接口)
public interface Printer {
public void print(int radius,int x,int y);
}
2.创建黑白打印机和彩色打印机作为ConcreteImplementor(具体实现类)
public class BlackPrinter implements Printer {
@Override
public void print(int radius, int x, int y) {
System.out.println("Black:" + radius + ",[ x :" + x + ",y :" + y + "]");
}
}
public class ColorPrinter implements Printer {
@Override
public void print(int radius, int x, int y) {
System.out.println("Color:" + radius + ",[ x :" + x + ",y :" + y + "]");
}
}
3.定义图形类为Abstraction(抽象类)
public abstract class Shape {
protected Printer printer;
protected Shape(Printer printer) {
this.printer = printer;
}
public abstract void draw();
}
4.定义RefinedAbstraction(扩充抽象类)
public class Circle extends Shape {
private int x,y,radius;
public Circle(Printer printer, int x, int y, int radius) {
super(printer);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
public void draw() {
printer.print(radius,x,y);
}
}
5.main方法验证
public class BridgeMain {
public static void main(String[] args) {
Shape redCircle = new Circle(new ColorPrinter(),100,100,10);
Shape blackCircle = new Circle(new BlackPrinter(),100,100,10);
redCircle.draw();
blackCircle.draw();
}
}