基础介绍:

  将抽象部分与它的实现部分分离,使它们都可以独立地变化。适用于不希望在抽象和实现部分之间有固定的绑定关系的情况,或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。

  将抽象部分与实现部分分离,使它们都可以独立地变化。

  其实两个都是抽象的部分,更准确的说,是将一个事物中多个维度的变化分离。

  比如不用软件运行在不同的操作系统上。

  操作系统是一个维度,分为ios、Android、Windows等。

  软件系统是一个维度,分别为微信、QQ、酷狗音乐等。

  一个维度可以认为是抽象部分,另一个维度可以认为是实现部分,而这两个维度可以独立扩充和维护。

  单独看起来比较复杂和难以理解,可以先大致看下基础结构,然后结合以下实例来解读。

  桥接模式的结构:

    Abstraction:定义抽象类的接口,一般为抽象类,规范RefinedAbstraction,并创建一个Implementor实例。主要靠这个类来进行桥接。

    RefinedAbstraction:Abstraction的子类,具体实现Abstraction里规定的方法。

    Implementor:定义实现类的接口,一般情况,Implementor接口仅为提供基本操作,而Abstraction则定义了基于基本操作的较高层次操作。

    ConcreteImplementor:Implementor的子类,具体实现Implementor接口 。

  在桥接模式中,两个类Abstraction和Implementor分别定义了抽象与行为类型的接口,通过调用子类实现抽象与行为的动态组合。

应用场景:

  适用于不希望在抽象和实现部分之间有固定的绑定关系的情况,或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。

创建方式:

  桥接模式的实现方式是通过在抽象类中持有一个指向实现类的引用,从而将抽象类与实现类解耦。

  通常情况下,抽象类和实现类都需要定义自己的接口,以便彼此之间进行通信。

实例一:不用软件运行在不同的操作系统上。

   操作系统是一个维度,分为ios、Android、Windows等。

   软件系统是一个维度,分别为微信、QQ、酷狗音乐等。

   这两个维度可以独立扩充和维护,一个维度可以认为是抽象部分,另一个维度可以认为是实现部分。

   实现部分中的接口(Implementor)只需提供基本操作,抽象部分中的接口(Abstraction)来创建一个实现接口(Implementor)实例,用这个实例将两部分紧密连续在一起。

   抽象部分也是基于这个实例才做一些较高层次的操作。

   在这里可以把操作系统当做抽象部分,把软件系统当做实现部分。

   在抽象部分中创建一个抽象类(Abstraction),该类中创建一个软件系统的实例,即实现类的实例(Implementor),并规定抽象部分具体实现类(RefinedAbstraction)要实现哪些方法。

   注:抽象类和接口主要起桥梁作用和规范作用(Abstraction和Implementor),其具体实现都在其子类中(RefinedAbstraction和ConcreteImplementor)。

   在实现部分中创建一个接口(Implementor),该接口主要规范实现类(ConcreteImplementor)需要实现的方法。

   RefinedAbstraction和ConcreteImplementor分别继承自Abstraction和Implementor,并实现其规定的方法。

   即:

     Abstraction ---》操作系统抽象类

     RefinedAbstraction---》ios、Android、Windows等具体实现

     Implementor----》软件接口类

     ConcreteImplementor---》微信、QQ、酷狗音乐等具体实现

1、软件接口类

 1     /// <summary>
2 /// 软件接口类
3 /// </summary>
4 public interface ISoftWare
5 {
6 /// <summary>
7 /// 定义一个软件启动方法
8 /// </summary>
9 void Start();
10 }

Implementor-实现类接口,只声明最基本的方法。

2、软件实现类

 1     /// <summary>
2 /// 微信
3 /// </summary>
4 public class WeChat : ISoftWare
5 {
6 public void Start()
7 {
8 Console.WriteLine("启动微信");
9 }
10 }
11
12 /// <summary>
13 /// QQ
14 /// </summary>
15 public class TencentQQ : ISoftWare
16 {
17 public void Start()
18 {
19 Console.WriteLine("启动QQ");
20 }
21 }

ConcreteImplementor-继承自实现类接口,实现其基本方法。

3、系统抽象类

 1     /// <summary>
2 /// 系统抽象类(桥接类)
3 /// </summary>
4 public abstract class SystemPlatform
5 {
6 //创建软件类实例
7 public ISoftWare _softWare;
8
9 //通过构造函数注入具体软件实例
10 public SystemPlatform(ISoftWare softWare)
11 {
12 this._softWare = softWare;
13 }
14
15 //执行软件运行
16 public abstract void Run();
17 }

Abstraction-操作系统抽象类,创建一个实现类实例,用来访问实现类内的操作。

该类为实际的桥接类,其他还规范了更高一层的方法。

4、系统平台实现类

 1     /// <summary>
2 /// ios系统
3 /// </summary>
4 public class IosSys : SystemPlatform
5 {
6 public IosSys(ISoftWare softWare)
7 : base(softWare)
8 {
9 Console.WriteLine("进入IOS系统");
10 }
11 public override void Run()
12 {
13 _softWare.Start();
14 }
15 }
16
17 /// <summary>
18 /// Android系统
19 /// </summary>
20 public class AndroidSys : SystemPlatform
21 {
22 public AndroidSys(ISoftWare softWare)
23 : base(softWare)
24 {
25 Console.WriteLine("进入Android系统");
26 }
27 public override void Run()
28 {
29 _softWare.Start();
30 }
31 }

RefinedAbstraction-系统抽象具体实现类,实现了各个实际功能。

 5、客户端

 1     /// <summary>
2 /// 客户端
3 /// </summary>
4 class Client
5 {
6 static void Main(string[] args)
7 {
8 //创建软件对象
9 WeChat weChat = new WeChat();
10 TencentQQ tencentQQ = new TencentQQ();
11
12 //创建操作系统并安装软件
13 SystemPlatform systemPlatform = new IosSys(weChat);
14 systemPlatform.Run();
15
16 systemPlatform = new AndroidSys(tencentQQ);
17 systemPlatform.Run();
18
19 Console.ReadKey();
20 }
21 }

这只是一个简单的实例,如果一个系统中预装载多个软件,可以将构造函数改为集合参数或者申明其他公开方法进行预安装。

实例二:不同形状的物体赋予不同颜色。

   不同形状的物体是一个维度,分别为长方形、矩形、圆形等。

   不同颜色是一个维度,分别为白色、黑色、红色等。

   即:

    Abstraction ---》形状抽象类

    RefinedAbstraction---》方形 圆形等具体实现

    Implementor----》颜色接口类

    ConcreteImplementor---》白色 黑色等具体实现

1、颜色接口类

1     public interface Color
2 {
3 void Bepaint();
4 }

规范颜色实现类,并供形状抽象类使用和维护。

2、颜色实现类

 1     public class White : Color
2 {
3 public void Bepaint()
4 {
5 Console.WriteLine("白色的");
6 }
7 }
8
9 public class Gray : Color
10 {
11 public void Bepaint()
12 {
13 Console.WriteLine("灰色的");
14 }
15 }
16
17 public class Black : Color
18 {
19 public void Bepaint()
20 {
21 Console.WriteLine("黑色的");
22 }
23 }

3、形状抽象类

1     public abstract class Shape
2 {
3 public Color color;
4 public void SetColor(Color color)
5 {
6 this.color = color;
7 }
8 public abstract void Draw();
9 }

创建颜色实例供实现类使用,并规范实现类。

这个类主要是将形状和颜色两个维度的东西联系在一起,并制定高一级的操作规范。

4、形状实现类

 1     public class Circle : Shape
2 {
3 public override void Draw()
4 {
5 color.Bepaint();
6 Console.WriteLine("圆形");
7 }
8 }
9 public class Rectangle : Shape
10 {
11
12 public override void Draw()
13 {
14 color.Bepaint();
15 Console.WriteLine("长方形");
16 }
17 }
18 public class Square : Shape
19 {
20 public override void Draw()
21 {
22 color.Bepaint();
23 Console.WriteLine("正方形");
24 }
25 }

具体实现类

5、客户端

 1     class Client
2 {
3 static void Main(string[] args)
4 {
5 //白色
6 Color white = new White();
7 //正方形
8 Shape square = new Square();
9 //白色的正方形
10 square.SetColor(white);
11 square.Draw();
12
13 //长方形
14 Shape rectange = new Rectangle();
15 rectange.SetColor(white);
16 rectange.Draw();
17
18 Console.ReadKey();
19 }
20 }

其实颜色和形状两个维度的东西,各自维护和发展并不互相影响。

使用的时候也是将一个维度的东西加装的另一个维度上去,搭建一个桥梁供另一个维度去使用。

至于怎么加载就无所谓了,可以在构造函数中指定,也可以在方法参数中传递。

总结:

  将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  桥接模式的实现方式是通过在抽象类中持有一个指向实现类的引用,从而将抽象类与实现类解耦。

  通常情况下,抽象类和实现类都需要定义自己的接口,以便彼此之间进行通信。

  

c#桥接模式详解的更多相关文章

  1. Linux下桥接模式详解一

    注册博客园已经好长时间,一直以来也没有在上面写过文章,都是随意的记录在了未知笔记上,今天开始本着分享和学习的精神想把之前总结的笔记逐步分享到博客园,和大家一起学习,一起进步吧! 2016-09-20  ...

  2. Linux网络配置:Nat和桥接模式详解

    Linux网络配置:Nat和桥接模式详解 一.我们首先说一下VMware的几个虚拟设备: Centos虚拟网络编辑器中的虚拟交换机: VMnet0:用于虚拟桥接网络下的虚拟交换机: VMnet1:用于 ...

  3. LInux下桥接模式详解三

    上篇文章介绍了Linux内核桥接模式涉及到的几个结构,本节就重点放在数据包的处理上! 本节所有代码参考LInux 3.10.1内核! 前面已经提到一个数据包从网卡流到Linux内核中的L2层,最终被交 ...

  4. LInux下桥接模式详解二

    上篇文章导入博客园的比较早,而这篇自己在写的时候才发现内部复杂的很,以至于没能按时完成,造成两篇文章的间隔时间有点长! 话不多说,言归正传! 前面的文章介绍了桥接模式下的基础理论知识,其实本节想结合L ...

  5. Docker:网络模式详解

    Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...

  6. Docker网络模式详解

    一.Docker四种工作模式 安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .hosthost:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用 ...

  7. docker 网络概述及网络模式详解

    docker 网络概述及网络模式详解 1.网络概述 2.网络模式详解 1.网络概述: Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0) ...

  8. 【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现

    [桥接设计模式详解]Java/JS/Go/Python/TS不同语言实现 简介 桥接模式(Bridge Pattern)是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的 ...

  9. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

  10. JavaScript严格模式详解

    转载自阮一峰的博客 Javascript 严格模式详解   作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...

随机推荐

  1. System类_Calendar类_Date类_小记

    PrintStream(字节打印流) ps = System.out ; 标准输出流 PrintWriter(字符打印流) InputStream in = System.in; 标准输入流 常用的成 ...

  2. 数据标注工具 Label-Studio

    文档抽取任务Label Studio使用指南 目录 1. 安装 2. 文档抽取任务标注 2.1 项目创建 2.2 数据上传 2.3 标签构建 2.4 任务标注 2.5 数据导出 2.6 数据转换 2. ...

  3. zabbix 可计算监控项使用 last() 与 avg() 的区别

    使用zabbix的可计算监控项时遇到的问题 在agent异常退出的情况下,使用last()的监控项依然在产出数据! 分析解决 last()函数会跳过空值,取最后一个有效值计算.遍查文档,只有用avg( ...

  4. PlayWright(二十二)- allure插件(一)

    在上文中,我们介绍并使用了pytest-html插件,总之并不复杂,但是今天我们要讲一个比pytest-html插件强很多的插件allure报告,我们要掌握他并且灵活使用,之后的框架就不需要考虑其他的 ...

  5. 2021-7-6 VUE笔记

    v-cloak:使用的display:none: 直到编译完成后开始显示: v-text和插值表达式,非必要响应式用v-text会比较好,使用插值表达式要加上v-cloak; v-html:不推荐使用 ...

  6. 借助 mkcert 和批处理命令生成局域网证书

    借助 mkcert 和批处理命令生成局域网证书 自动获取ipv4,一键生成很方便 cd /d %~dp0 ipconfig |find "IPv4" > ipv4 set / ...

  7. 关于"覆盖问题”的反思

    [HAOI2007]覆盖问题 题目描述 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定 用3个L*L的 ...

  8. 关于NOI2010“超级钢琴”的反思

    [NOI2010] 超级钢琴 题目描述 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 \(n\ ...

  9. FlinkSQL类型系统

    类型有什么作用, 类型可以提供编译期检查, 避免到运行期才报错. 类型 首先Flink中自己定义了一套类型, 有LogicalType和DataType两个表示 LogicalType Logical ...

  10. 三维模型OSGB格式轻量化的纹理压缩和质量保持分析

    三维模型OSGB格式轻量化的纹理压缩和质量保持分析 在三维模型应用中,纹理数据是一个重要的部分,可以为模型增加更多的真实感和细节.但是,由于纹理数据通常会占用大量的存储空间和传输带宽,因此,在OSGB ...