桥接模式,也称桥梁模式,主要用意为抽象部分与实现部分相分离(脱耦),使它们可以各自独立的变换。桥接模式为结构型模式
那为什么要抽象实现相分离呢?什么时候用呢?使用它有什么好处呢?这里还是以毛笔、蜡笔、颜料为例。首先是我们的需求:画出一副尺寸较大的图画。我们知道,画一幅画,尤其是大尺寸的画,需要大号、中号、小号三种型号的笔,色彩也需要各种不同的颜色,这样才能画出色彩均匀、精致的图画。ok,需求有了,工具也有了。下面开始制定方案,因为我们有蜡笔和毛笔两种画笔,而没有要求必须使用什么画笔,所以我们很容易就制定出两种方案:
(1)用蜡笔:为了节省资源,我们使用最少的颜色,即RGB色彩模式,所以需要:大中小型号蜡笔、红绿蓝蜡笔,由于蜡笔的型号与颜色不能分离,所以我们需要3*3=9种不同的蜡笔。
(2)用毛笔,依然是三种型号与三种颜色,但由于毛笔的型号和颜料可以分离,所以我们只需要3+3=6种,之后将型号与颜色组合起来。
这里只用到了最少的颜色与型号,如果有36种颜色,12种型号的笔,那又是什么选择呢?我们需要36*12=432支不同的蜡笔,或者36种颜料+12支毛笔。而随着两种维度(型号与颜色)变换的加剧,甚至出现第三种维度,这样的优势就会愈来愈明显了。下面是上述方案的代码实现:
1.蜡笔抽象以及实现类
public abstract class Crayon {
public abstract void print();
}
//大号红色蜡笔
public class RedBigCrayon extends Crayon {
@Override
public void print() {
System.out.println("This is Red Big Crayon!");
}
}
//小号红色蜡笔
public class RedSmallCrayon extends Crayon {
@Override
public void print() {
System.out.println("This is Red Small Crayon!");
}
}
2.颜料类
public class Color {
protected String color;
}
//红色颜料
public class Red extends Color{
public Red(){
this.color="Red";
}
}
//绿色颜料
public class Green extends Color {
public Green(){
this.color="Green";
}
}
//蓝色颜料
public class Blue extends Color {
public Blue(){
this.color="Blue";
}
}
3.毛笔抽象及实现类
public abstract class Brush {
protected Color c;
public void setColor(Color color){
this.c=color;
}
public abstract void paint();
}
//大号毛笔
public class BigBrush extends Brush {
@Override
public void paint() {
System.out.println("使用大号"+this.c.color+"毛笔");
}
}
//小号毛笔
public class SmallBrush extends Brush{
@Override
public void paint() {
System.out.println("使用小号"+this.c.color+"毛笔");
}
}
4.客户端-测试类
public class Test {
public static void main(String[] args){
//使用蜡笔,每种蜡笔都要单独创建,要创建九种
Crayon crayon=new RedBigCrayon();
Crayon crayon1=new RedSmallCrayon();
//使用毛笔,只需创建三种颜料,三种毛笔
Color red=new Red();
Color green=new Green();
Color blue=new Blue();
Brush brush=new BigBrush();
Brush brush1=new SmallBrush();
brush.setColor(red); //大号红色毛笔
brush.setColor(green);//大号绿色毛笔
brush.setColor(blue);//大号蓝色毛笔
brush1.setColor(red); //小号红色毛笔
}
}
桥接模式的使用场景:1.当系统构件需要将抽象化与具体化各自可以灵活的变化时,应避免使用静态关系。2.要求实现化角色的改变对客户端无影响或者对客户端完全透明。3.当构件有多于一个的抽象化角色和具体化角色时,系统需要他们之间动态耦合