基础介绍:

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

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

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

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

  操作系统是一个维度,分为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. 报错 no currentsessioncontext configured!

    no currentsessioncontext configured! 使用hibernate框架报错 配置了session工厂类,使用getCurrentSession();时候引起的,原因是cu ...

  2. 在windows平台使用Visual Studio 2017编译动态库并使用

    使用VS stdio制作顺序表的库文件 .lib与.dll 区别 lib是编译时需要的 dll是运行时需要的 1.新建头文件和源文件 SeqList.h // SeqList.h #ifndef SE ...

  3. 【译】Visual Studio 2022 中的 Web API 开发

    在 Visual Studio 2022 中,Web 开发人员的主要场景之一是使用 ASP.NET Core 创建 Web API.在 Visual Studio 2022 17.6 的最新预览版中, ...

  4. 使用 vscode 远程登陆自己的电脑/服务器 (不需要内网穿透 😇)

    问题背景 最近有远程调试的需求,从笔记本连入配置比较高的电脑(windows)运行代码,查阅资料后,了解到大致就是两个方法: 共享屏幕远程控制,如 to desk, 向日葵 内网穿透 + ssh 第一 ...

  5. Cilium系列-10-启用 IPv6 BIG TCP和启用巨帧

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  6. 【入门教程】3202年了,还有人没用stable diffusion画过自己的AI小姐姐吗。

    个人绘画作品: 说明 本文主要是讲一下如何安装.使用整合包,以及介绍画真人图片的大模型(介绍的整合包只提供二次元模型,个人不太感兴趣) 通过最简单的介绍帮助大家快速入门,开始画图,不会深入的进行讲解, ...

  7. Redis系列18:过期数据的删除策略

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  8. [HDCTF2019]Maze 反汇编-花指令处理

    这是一道迷宫花指令加upx脱壳处理的题 先介绍花指令 一. 概述 花指令是对抗反汇编的有效手段之一,正常代码添加了花指令之后,可以破坏静态反汇编的过程,使反汇编的结果出现错误.错误的反汇编结果会造成破 ...

  9. cs50ai1

    cs50ai1-------Knowledge cs50ai1-------Knowledge 基础知识 课后题目 代码实践 学习链接 总结 基础知识 对我们来说,一些基本的logic是自然而然的,我 ...

  10. .NET周刊【8月第3期 2023-08-20】

    国内主题 抓的是周树人,与我鲁迅有什么关系? https://www.cnblogs.com/JulianHuang/p/17642511.html 问题:作者看到了一个关于Dictionary.Cl ...