桥接模式介绍
桥接模式是指通过将抽象与实现分开,并在二者之间搭建一个桥梁,来实现设计的解耦。打个比方说现在要生产不同型号的杯子,每个型号的杯子都有各自的颜色,如下图所示
上面的结构如果用代码去实现,就是这样:创建一个抽象的表示杯子的类,里面有一个抽象方法用来生产杯子,再创建三个不同型号的杯子类继承并重写抽象杯子类的方法,用来生产不同型号的杯子;因为现在不同型号的杯子又有不同的颜色,所以还要为每个型号的杯子创建表示不同颜色杯子的类,最后再让表示颜色的类去继承和重写其方法。这无疑是很繁琐的,工作量很大,而且代码的耦合度很高,不利于后期的扩展。
通过桥接模式实现上面的示例
开头说桥接模式的设计思路是将抽象与实现分开,目的是为了将两个可能会独立变化的部分分开。这样当一个部分出现变动的时候也不需要改动另外一个部分的内容。结构如下图所示
上图所表示的意思是将杯子的颜色单独剥离成独立的一块内容,将表示颜色的类传到表示杯子的类中,形成了一个从杯子对象到颜色对象的桥梁,在杯子类中传递的是什么颜色就生产什么颜色的杯子,即使后面添加了新的颜色,也不需要修改杯子类中的代码。
桥接模式示例代码
示例的代码包含一个表示杯子的抽象以及表示两种杯子型号的具体类,因为杯子有不同的颜色,所以还需要创建一个表示颜色的抽象和两个分别表示黑白色的具体类,最后将型号和颜色桥接起来,生产各种型号和颜色组合成的杯子。
创建一个杯子的抽象
/**
* 杯子抽象类
*/
public abstract class CupAbstract {
protected ColorAbstract cabstract;
public CupAbstract(ColorAbstract cabstract) {
this.cabstract = cabstract;
}
//生产杯子方法
public abstract void produce();
}
提示
ColorAbstract
是表示颜色的对象,通过构造器传的具体颜色对象为其赋值,实际上就实现了对颜色的桥接
创建两个表示杯子型号的具体类
/**
* 型号-大
*/
public class BigCup extends CupAbstract{
public BigCup(ColorAbstract cabstract) {
super(cabstract);
}
@Override
public void produce() {
System.out.println(cabstract.getColor()+",大号杯子");
}
}
/**
* 型号-小
*/
public class SmallCup extends CupAbstract{
public SmallCup(ColorAbstract cabstract) {
super(cabstract);
}
@Override
public void produce() {
System.out.println(cabstract.getColor()+",小号杯子");
}
}
提示
具体的型号类调用了父类的构造器传递具体的颜色对象,并且在produce()
方法中调用了父类的颜色对象属性,拿到了想要的颜色信息。
创建表示杯子颜色的抽象
public interface ColorAbstract {
public String getColor();
}
创建表示具体颜色的类
/**
* 黑色
*/
public class BlackColor implements ColorAbstract{
@Override
public String getColor() {
return "黑色";
}
}
/**
* 白色
*/
public class WhiteColor implements ColorAbstract{
@Override
public String getColor() {
return "白色";
}
}
开始制作不同型号及颜色的杯子
public class test_01 {
public static void main(String[] args) {
CupAbstract blackBigCup = new BigCup(new BlackColor());
blackBigCup.produce();
CupAbstract whiteBigCup = new BigCup(new WhiteColor());
whiteBigCup.produce();
CupAbstract blackSmallCup = new SmallCup(new BlackColor());
blackSmallCup.produce();
CupAbstract whiteSmallCup = new SmallCup(new WhiteColor());
whiteSmallCup.produce();
}
}
运行结果如下:
运行成功!
总结
桥接模式的好处是将代码的抽象与实现进行解耦,在通过桥接的模式将原本相互独立的部分进行连接,组合成我们想要的结果。一个独立部分的修改不会影响其他部分的内容,在这种设计模式下,可以通过将多个独立的部分进行组合来实现不同的结果,提高了代码的灵活性并减少了需要创建的类的数量。当一个主体需要依赖于多个维度的信息,并且这些维度的信息有可能发生变化的时候,通过桥接模式将多个维度独立出来是个很好的选择。