设计模式-结构型-桥接模式

桥接模式(Bridge):

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

桥接模式的角色:

  

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

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

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

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

为什么使用桥接模式?

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

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

案例:

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

桥接设计模式的优缺点:

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

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

使用场景:

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

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

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

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

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

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

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

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

(0)

相关推荐

  • C#设计模式-桥接模式(Bridge Pattern)

    引言 例如我有好几个项目,需要外包出去做各种类型的测试,不同的公司基础费用不同,不同的测试类型价格也是不同的.此时不同的项目选择不同的公司和不同类型的测试进行测试价格都是不同的.于是我们可以创建一个项 ...

  • 设计模式(7) 桥接模式

    桥接模式的概念与实现 为什么叫桥接模式 桥接模式的适用场景 继承是面向对象的三大特性之一,但很多时候使用继承的结果却不尽如人意.除了人尽皆知的紧耦合问题外,有的时候还会导致子类的快速膨胀. 设想这样一 ...

  • Matlab桥接模式

    桥接模式(Bridge)是一种结构型设计模式.它是用组合关系代替继承关系来实现,可以处理多维度变化的场景(https://blog.csdn.net/qq_31156277/article/detai ...

  • Java描述设计模式(08):桥接模式

    Java描述设计模式(08):桥接模式 原创知了一笑2019-08-23 07:00:00 写在前面 推荐阅读: Java描述设计模式(07):适配器模式 Java描述设计模式(06):建造者模式 J ...

  • 结构型模式:桥接模式

    七大结构型模式之二:桥接模式. 简介 姓名 :桥接模式 英文名 :Bridge Pattern 价值观 :解耦靠我 个人介绍 : Decouple an abstraction from its im ...

  • 设计模式-结构型模式总结

    结构型模式主要处理类或对象的组合,关注于如何将现有类或对象组织在一起形成更大的结构. 适配器模式 将一个类的接口转换成客户希望的另外一个接口,使原本不能一起工作的类可以一起工作. 适配器模式属于补偿机 ...

  • 设计模式-结构型-装饰者模式

    装饰者模式(wrapper): 允许向一个现有的对象添加新的功能,同时又不改变其结构.装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加 ...

  • 无废话设计模式(11)结构型模式--代理模式

    0-前言 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问. 1-实现 1-1.简单UML图: 1-2.代码实现 //1.抽象父类 abstract class Actor { public ...

  • 无废话设计模式(10)结构型模式--外观模式

    0-前言 外观模式定义:为子系统中的一组接口提供一个一致的界面,此模式定了一个高层接口    这一接口使得这一子系统更加容易使用: 1-实现 1-1.简单UML图: 1-2.代码实现 //1.子系统A ...

  • 无废话设计模式(9)结构型模式--享元模式

    0-前言 享元模式定义:运用共享技术有效地支持大量细粒度的对象. 1-实现 1-1.简单UML图:  1-2.代码实现 //1.抽象父类(网站父类) abstract class Website { ...

  • 每天学习一个设计模式(二):结构型之桥梁模式

    一.基本概念 桥梁模式(Bridge)是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是"将抽象化(Abstraction) ...

  • 结构型设计模式 - 组合模式详解

    基本介绍 1.组合模式(Composite Pattern)又叫部分整体模式,他创建了对象组的树形结构,将对象组合成树状结构以表示「整体 - 部分」的层次关系. 2.组合模式使得用户对单个对象和组合对 ...

  • 结构型设计模式 - 装饰者模式详解

    基本定义 装饰者模式属于结构型模式,它可以动态的将新功能附加到对象上,同时又不改变其结构.在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP). 模式结构 装饰者和被装饰者有相同 ...