什么是桥接模式?

我理解的是类似现实中的桥梁作用,两个对象之间搭建一种桥梁,近以达到互相连接的作用。对象之间一般使用组合的方式。
但是,教科书版的定义如下,较抽象:
将抽象与实现分离,使它们都可以独立地变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

适用场景

对象据有两个以上的维度的变化,将某一维度抽象出来,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。

代码实现

示例:几何图形有形状和颜色两个维度,如何实现不同颜色不同形状的几何图形?

  1. 使用继承,m种形状n种颜色共计会产生m*n种类,实现复杂,不利用后期修改和维护
  2. 使用组合,只需m+n种类定义即可,这种组合方式就是桥接模式
  1. // 实现不同形状 不同颜色的 几何图形
  2. import com.sun.org.apache.bcel.internal.generic.NEW;
  3. /**
  4. * 颜色
  5. */
  6. interface Color {
  7. //涂色
  8. public void color(String shape);
  9. }
  10. //具体的各种颜色
  11. /**
  12. * 红色
  13. */
  14. class RedColor implements Color {
  15. @Override
  16. public void color(String shape) {
  17. System.out.println("红色的"+shape);
  18. }
  19. }
  20. /**
  21. * 绿色
  22. */
  23. class GreenColor implements Color {
  24. @Override
  25. public void color(String shape) {
  26. System.out.println("绿色的"+shape);
  27. }
  28. }
  29. /**
  30. * 形状
  31. */
  32. abstract class Shape {
  33. protected Color color;
  34. public void setColor(Color color) {
  35. this.color = color;
  36. }
  37. public abstract void draw();
  38. }
  39. //各种具体的形状
  40. /**
  41. * 矩形
  42. */
  43. class Rectangle extends Shape{
  44. @Override
  45. public void draw() {
  46. this.color.color("矩形");
  47. }
  48. }
  49. /**
  50. * 圆形
  51. */
  52. class Circular extends Shape{
  53. @Override
  54. public void draw() {
  55. this.color.color("圆形");
  56. }
  57. }
  58. /**
  59. * 桥接模式测试
  60. */
  61. public class BridgePattern {
  62. public static void main(String[] args) {
  63. //红色
  64. Color red = new RedColor();
  65. //绿色
  66. Color green = new GreenColor();
  67. //矩形
  68. Shape rectangle = new Rectangle();
  69. //圆形
  70. Shape circular = new Circular();
  71. //红色的矩形
  72. rectangle.setColor(red);
  73. rectangle.draw();
  74. //绿色的圆形
  75. circular.setColor(green);
  76. circular.draw();
  77. //输出:
  78. //红色的矩形
  79. //绿色的圆形
  80. }
  81. }