一、一句话背景
假如我有一个画图工具,这个画图工具可以画各种图形,各种图形又可以扩展各种颜色,那么对于这个场景,形状和颜色都是可拓展的,结合起来时,使用一个桥接器,实现各自管理各自维度的拓展就比较合理了。
PS:若直接从图形类型、颜色去扩展Shape类,耦合度会很高,这里的桥接器承担了图形颜色的拓展,此时Shape类(抽象部分)不再关心它自己要怎么实现,反正实现就根据传入的DrawAPI对象(实现部分)去愉快的玩耍就好了,这就实现了解耦。
二、使用场景
对于两个独立变化的维度,使用桥接模式再适合不过了。
如:一个业务多维度扩展时可考虑桥接模式进行解决。
三、模型分析
桥接器:用于减少耦合
图形类(Shape类) :优化前:需要对图形类别(第一层维度)、颜色(第二层维度)都进行拓展,那图形类就会
有非常多的个性化实例。
优化后:设置了一个入参为DrawAPI对象的构造方法,应用于多维度的图形拓展场景。引入了
桥接器以后,只对图形类别(第一层维度)进行拓展,颜色(第二层维度)的拓展由
桥接器负责,实现解耦。
个性化图形:Shape类的个性化拓展,只进行图形类别(第一层维度)的拓展
个性化颜色:桥接器的个性化拓展,用于分担更细化的维度,颜色(第二层维度)的拓展
四、代码分析
桥接器
/** * 桥接接口,定义了各种画图形的方法,实现此接口即是对颜色的拓展 */ public interface DrawAPI { //画个圆 void drawCircle(int radius, int x, int y); //画个正方形 void drawSquare(int x, int y); }
图形类 (Shape类)
/** * 图形类 */ public abstract class Shape { protected DrawAPI drawAPI; //构造方法,传入一个扩展后的个性化图形对象 protected Shape(DrawAPI drawAPI) { this.drawAPI = drawAPI; } //图形类的画画方法 public abstract void draw(); }
个性化图形
/** * 圆形类 */ public class Circle extends Shape { private int x, y, radius; //圆形类构造方法 public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; this.radius = radius; } //圆形类的画画方法 public void draw() { drawAPI.drawCircle(radius, x, y); } }
/** * 正方形类 */ public class Square extends Shape { private int x, y; //正方形类构造方法 public Square(int x, int y, DrawAPI drawAPI) { super(drawAPI); this.x = x; this.y = y; } //正方形类的画画方法 public void draw() { drawAPI.drawSquare(x, y); } }
个性化颜色
/** * 原谅色圆形 */ public class GreenCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("画一个原谅色圆形~"); } @Override public void drawSquare(int x, int y) { //画不出来!我是正经的原谅色圆形! } }
/** * 原谅色正方形 */ public class GreenSquare implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { //画不出来!我是正经的原谅色正方形! } @Override public void drawSquare(int x, int y) { System.out.println("画一个原谅色正方形~"); } }
/** * 红色圆形 */ public class RedCircle implements DrawAPI { @Override public void drawCircle(int radius, int x, int y) { System.out.println("画一个红色圆形~"); } @Override public void drawSquare(int x, int y) { //画不出来!我是正经的红色圆形! } }
模拟调用画图
/** * 模拟画画 */ public class BridgePatternDemo { public static void main(String[] args) { Shape redCircle = new Circle(100, 100, 10, new RedCircle()); Shape greenCircle = new Circle(100, 100, 10, new GreenCircle()); Shape greenSquare = new Square(100, 100, new GreenSquare()); redCircle.draw(); greenCircle.draw(); greenSquare.draw(); } }