喜欢上一个不喜欢你的人,那种可望不可及,放弃又不甘心的感觉,怎一个愁字了得。
桥接模式
定义:用于把抽象化和实现化解耦,使得二者可以独立变化。
我承认我不知道这个定义是啥意思,等以后有了更深的理解,再来补充。
举例说明 画图形
我们可以定义一个抽象类Shape,然后派生出长方形,三角形,圆形等等

现在如果我们要画出不同颜色的各种形状,该怎么办呢?
-
第一种方式,就是直接从Shape派生各种颜色的形状。比如我们现在有红绿蓝三种颜色,那么类图会是这样的。
Class Diagram (1).png
如果现在有四个形状,四种颜色,那么,生成的子类数量就比较客观了。
-
第二种方式,根据实际需要对颜色和形状进行组合。提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合。如下图所示。
Class Diagram (2).png
Shape抽象类
package com.hm.pattern.bridge;
public abstract class Shape {
Color color;
public Shape(Color color) {
this.color = color;
}
protected abstract void draw();
}
Rectangle
package com.hm.pattern.bridge;
public class Rectangle extends Shape {
public Rectangle(Color color) {
super(color);
}
@Override
protected void draw() {
color.drawColorShape("rectangle");
}
}
Circle
package com.hm.pattern.bridge;
public class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
protected void draw() {
color.drawColorShape("circle");
}
}
Triangle
package com.hm.pattern.bridge;
public class Triangle extends Shape {
public Triangle(Color color) {
super(color);
}
@Override
protected void draw() {
color.drawColorShape("triangle");
}
}
Color抽象类
package com.hm.pattern.bridge;
public abstract class Color {
abstract void drawColorShape(String shape);
}
Red
package com.hm.pattern.bridge;
public class Red extends Color {
@Override
void drawColorShape(String shape) {
System.out.println("red:" + shape);
}
}
Blue
package com.hm.pattern.bridge;
public class Blue extends Color {
@Override
void drawColorShape(String shape) {
System.out.println("blue:" + shape);
}
}
Green
package com.hm.pattern.bridge;
public class Green extends Color {
@Override
void drawColorShape(String shape) {
System.out.println("green:" + shape);
}
}
测试类
package com.hm.pattern.bridge;
public class BridgeTest {
public static void main(String[] args) {
Color red = new Red();
Shape rectangle = new Rectangle(red);
Shape circle = new Circle(red);
Color blue = new Blue();
Shape rectangleBlue = new Rectangle(blue);
Shape circleBlue = new Circle(blue);
rectangle.draw();
circle.draw();
rectangleBlue.draw();
circleBlue.draw();
}
}
输出
red:rectangle
red:circle
blue:rectangle
blue:circle
优点
- 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 实现细节对客户透明,可以对用户隐藏实现细节。
缺点
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
使用场景
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
先记录下来,在后续的学习研究中再不断补充。
网友评论