桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。
感觉听完上面的描述,没有几个人能够描述桥接模式到达怎么实现。
据我个人的理解,桥接模式一般用于适用于以下情况,某个类的子类都多个维度的变化,如果都分别实现,可能会造成子类的爆炸。
可以把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
下面通过画笔这个例子,来解读一下桥接模式。
photoshop很多人都用过,画笔既可以用来画圆,也可以画方,既可以画红色,也可以画蓝色。
假如形状有10种,颜色有10种,分别实现就会有10*10=100个子类,关键是还不止形状和颜色两个维度,如果再加上线条粗细,背景色等维度就真的太繁琐了。
我们将形状Shape和颜色Color解耦合,分别实现
public abstract class Color { @Override public String toString() { return this.getClass().getSimpleName(); } } public class BlueColor extends Color{ } public class GreenColor extends Color{ } public class RedColor extends Color{ }
在实现一个Shape类,持有一个颜色Color属性
public abstract class Shape { private Color color; public void setColor(Color color) { this.color = color; } public Color getColor() { return color; } abstract void draw(); } //正方形 public class Square extends Shape{ @Override void draw() { System.out.println(getColor()+" "+this.getClass().getSimpleName()); } } //圆形 public class Circle extends Shape{ @Override void draw() { System.out.println(getColor()+" "+this.getClass().getSimpleName()); } } //长方形 public class Rectangle extends Shape{ @Override void draw() { System.out.println(getColor()+" "+this.getClass().getSimpleName()); } }
这样就可以让形状和颜色分别实现
public class PaintBoard { public static void main(String[] args) { BlueColor blueColor = new BlueColor(); Square square = new Square(); square.setColor(blueColor); square.draw(); } } //输出 BlueColor Square