经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式-结构型-桥接模式
来源:cnblogs  作者:酷学大叔  时间:2019/9/23 10:05:18  对本文有异议

桥接模式(Bridge):

  桥接是用于把抽象化与实现化解耦,使得两者可以独立变化。

桥接模式的角色:

   

  1)抽象化角色(Abstraction):它是用于定义抽象接口,通常是抽象类而不是接口,其中定义了一个Implementor(实现接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系。

  2)改善后的抽象化角色(RefinedAbstraction):通常是具体类,实现了Abstraction中的抽象方法,在RefinedAbstraction中可以调用Implementor中定义的方法。

  3)实现者角色(Implementor):通常情况下提供一些基本操作的声明,将具体实现交给其子类。

  4)具体的实现者角色(ConcreteImplementorA、ConcreteImplementorB):实现了Implementor种定义的方法,运行时根据里氏替换原则,ConcreteImplementor对象将替换其父类对象,提供给抽象对象类具体的业务操作方法。

为什么使用桥接模式?

  我们都知道遥控器的通用功能是开机、关机,早先我们的做法应该是这样的:创建一个抽象遥控器类,里面定义开机、关机的一组方法,然后创建具体的遥控器类去继承或实现这个接口,这样就可以满足每个电视机的需求。但突然有一天,客户觉得这个遥控器的功能太少了,需要增加一个返回按钮,这个时候你傻眼了,你给抽象类添加了一个新方法,突然发现程序大面积报错,原因是子类未实现父类方法,于是霹雳巴拉一通改。好不容易改好了,客户又说了:想要一个菜单功能,于是....

  从上面的例子看出,这种设计违背了OCP原则,原因是类与类之间的耦合性过高,那怎样降低耦合呢?桥接模式是用于把抽象化和实现化解耦,使得两者可以独立变化。

案例: 

  1. 1 internal class Program
  2. 2 {
  3. 3 private static void Main(string[] args)
  4. 4 {
  5. 5 ImageImp image = new WindowsImp();
  6. 6 Image img = new JPGImage();
  7. 7 img.SetImageImp(image);
  8. 8 img.ParseFile("中国地图");
  9. 9 }
  10. 10 }
  11. 11
  12. 12 /// <summary>
  13. 13 /// 抽象操作系统实现类
  14. 14 /// </summary>
  15. 15 internal interface ImageImp
  16. 16 {
  17. 17 void DoPaint();
  18. 18 }
  19. 19
  20. 20 /// <summary>
  21. 21 /// Windows操作系统实现类,充当具体实现类
  22. 22 /// </summary>
  23. 23 internal class WindowsImp : ImageImp
  24. 24 {
  25. 25 public void DoPaint()
  26. 26 {
  27. 27 Console.WriteLine("在Windows操作系统中显示图像");
  28. 28 }
  29. 29 }
  30. 30
  31. 31 /// <summary>
  32. 32 /// Linux操作系统实现类,充当具体实现类
  33. 33 /// </summary>
  34. 34 internal class LinuxImp : ImageImp
  35. 35 {
  36. 36 public void DoPaint()
  37. 37 {
  38. 38 Console.WriteLine("在Linux操作系统中显示图像");
  39. 39 }
  40. 40 }
  41. 41
  42. 42 /// <summary>
  43. 43 /// 抽象图像类,充当抽象类
  44. 44 /// </summary>
  45. 45 internal abstract class Image
  46. 46 {
  47. 47 protected ImageImp imp;
  48. 48
  49. 49 public void SetImageImp(ImageImp imp)
  50. 50 {
  51. 51 this.imp = imp;
  52. 52 }
  53. 53
  54. 54 public abstract void ParseFile(string fileName);
  55. 55 }
  56. 56
  57. 57 /// <summary>
  58. 58 /// JPG格式图像类,充当扩充抽象类
  59. 59 /// </summary>
  60. 60 internal class JPGImage : Image
  61. 61 {
  62. 62 public override void ParseFile(string fileName)
  63. 63 {
  64. 64 imp.DoPaint();
  65. 65 Console.WriteLine("{0},格式为JPG", fileName);
  66. 66 }
  67. 67 }
  68. 68
  69. 69 /// <summary>
  70. 70 /// PNG格式图像类,充当扩充抽象类
  71. 71 /// </summary>
  72. 72 internal class PNGImage : Image
  73. 73 {
  74. 74 public override void ParseFile(string fileName)
  75. 75 {
  76. 76 imp.DoPaint();
  77. 77 Console.WriteLine("{0},格式为PNG", fileName);
  78. 78 }
  79. 79 } 

桥接设计模式的优缺点:

  优点:抽象接口与其实现解耦,其中的抽象和实现可以独立的进行扩展,不会影响对方。

  缺点:增加了系统的复杂度。

使用场景:

  1)如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系;

  2)设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的;

  3)需要跨越多个平台的图形和窗口系统上;

  4)一个类存在两个独立变化的维度,且两个维度都需要进行扩展。

桥接模式和适配器模式代理模式的区别:

  1)桥接模式提出是为了使用变化的,即需求发生多维度变化怎么办?而适配器模式的提出是为了解决兼容性问题,即由不兼容到兼容;代理模式提出主要是为了接口隔离。

参考:https://www.cnblogs.com/libingql/p/3496075.html

  https://www.cnblogs.com/arxive/p/6909405.html

原文链接:http://www.cnblogs.com/az4215/p/11570294.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号