桥梁模式是为了解决将抽象部分与实现部分分离,好让他们都在自己的维度上有多维度地变化。
为了充分理解上面的含义,举个例子来说明,假如市面上电视和遥控器来自不同产家,遥控器要实现针对每个不同的电视需要不同的遥控器,那么我们可能看到如下的结果
每个具体的遥控器都去继承或是实现遥控器的抽象或是接口,并且在每个具体的遥控器内部都聚合了各自的电视机接口。这种方案可以解决问题,可以解决遥控器与电视机的对应关系。可是,却有一个问题,就像上面场景中所说的,如果这里的有一些新的电视机出现,那么生产遥控器的产商还得去生产新的遥控器。这样一来各自的遥控器数量不但不好把握,而且这样的设计很繁杂
下面开始桥梁模式,首先看下 UML 类图
再举个例子来看,比如画笔有类型不同,颜色不同;那么类型中也有可能新增,颜色也有可能新增,如何设计这个情况
如果需要增加一种新型号的毛笔,只需扩展左侧的“抽象部分”,增加一个新的扩充抽象类;如果需要增加一种新的颜色,只需扩展右侧的“实现部分”,增加一个新的具体实现类。扩展非常方便,无须修改已有代码,且不会导致类的数目增长过快。
代码过一遍,首先把毛笔抽象类写出
public abstract class Maobi { protected MyColor color; public void setColor(MyColor color){ this.color=color;
} public abstract void paint();
}
把具体的两个毛笔实现类
public class BigMaobi extends Maobi{ @Override
public void paint() { //着色
System.out.println("这个是大毛笔!");
color.color();
}
}public class SmallMaobi extends Maobi{ @Override
public void paint() {
System.out.println("这个是小毛笔");
color.color();
}
}
抽象部分,颜色的接口
public abstract class MyColor { public abstract void color();
}
颜色接口的 具体实现
public class RedColor extends MyColor{ @Override
public void color() {
System.out.println("红色");
}
}public class GreenColor extends MyColor{ @Override
public void color() {
System.out.println("这个是绿色");
}
}
最后构建客户端运行下
public class Client { public static void main(String[] args) {
Maobi mb=new BigMaobi();
MyColor color=new RedColor();
mb.setColor(color);
mb.paint();
}
}
可以得出,需要改造笔的不同型号,继承 Maobi 类就可以,和颜色无关,颜色需要新增的话,就实现 MyColor,也与毛笔类型无关,这样在各自的维度自由飞翔。