文章目录
- 概念
- 结构
- 实例
- 总结
概念
桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出12种颜色,蜡笔需要3*12=36支,毛笔需要3支毛笔+12个颜色=15个对象。当扩展一种型号的画笔时,蜡笔再需要12支,毛笔只需要一支。毛笔的这种思想的本质就是桥接模式。
颜色和型号是两个不同的变化维度,各自进行扩展理应该不影响另外一方,但蜡笔将颜色和型号糅合在了一起,这就产生了耦合,当一方发生扩展时势必要引起另一方的变动。
结构
桥接模式的结构图如下:
Abstraction(抽象类):用于定义抽象类的接口,其中定义了一个Implementor类型的对象。Abstraction中可以使用Implementor中的方法,通过关联的方式,而不是继承。该接口即可以包含抽象业务方法也可以包含具体业务方法;它可以理解为是毛笔。
RefinedAbstraction(扩充抽象类):它是Abstraction的实现。
Implementor(实现类接口):该接口提供一些基本的操作,并将这些基本的实现让子类来完成;它可以理解为是颜色。
ConcreteImplementor(具体实现类):它具体实现了Implementor接口,在不同的ConcreteImplementor中有不同的实现操作。
实例
现在以毛笔为例,实现它的demo
毛笔的抽象类
public abstract class Quill {
protected Color color;
protected Quill (Color color) {
this.color = color;
}
public abstract void draw(Color color);
}
颜色的抽象类,与毛笔的抽象类是桥接关系。
public abstract class Color {
abstract void color();
}
大号毛笔
public class BigQuill extends Quill {
public BigQuill(Color color) {
super(color);
}
@Override
public void draw(Color color) {
System.out.println("大号毛笔");
color.color();
}
}
中号毛笔
public class MediumQuill extends Quill {
public MediumQuill(Color color) {
super(color);
}
@Override
public void draw(Color color) {
System.out.println("中号毛笔");
color.color();
}
}
小号毛笔
public class SmallQuill extends Quill {
public SmallQuill(Color color) {
super(color);
}
@Override
public void draw(Color color) {
System.out.println("小号毛笔");
color.color();
}
}
红色
public class RedColor extends Color {
@Override
void color() {
System.out.println("红色");
}
}
绿色
public class GreenColor extends Color{
@Override
void color() {
System.out.println("绿色");
}
}
黑色
public class BlackColor extends Color{
@Override
void color() {
System.out.println("黑色");
}
}
客户端
public class Client {
public static void main(String[] args) {
Color redColor = new RedColor();
Quill bigQuill = new BigQuill(redColor);
bigQuill.draw(redColor);
}
}
总结
在使用桥接模式时应该识别出一个类具有两个独立的变化维度,就比如毛笔本身具有一个维度,需要画出颜色就需要另外一个维度–颜色,颜色本身并不属于毛笔中的属性,它和毛笔本身是一个“设置”关系,所以它也可以作为一个抽象类,和毛笔进行桥接。
桥接模式使用的场景:
1、如果一个系统需要在抽象化和具体化之间增加更多的灵活性,可以考虑通过桥接模式使它们建立一个抽象的管理关系。
2、抽象部分和被“设置”部分可以通过继承的方式独立扩展而不相互影响。
3、一个类存在多个独立的变化维度,而这些维度需要独立的进行扩展。
4、不希望因为使用继承或多重继承而导致类的个数急剧增加的系统。