c#桥接模式详解
基础介绍:
将抽象部分与它的实现部分分离,使它们都可以独立地变化。适用于不希望在抽象和实现部分之间有固定的绑定关系的情况,或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。
将抽象部分与实现部分分离,使它们都可以独立地变化。
其实两个都是抽象的部分,更准确的说,是将一个事物中多个维度的变化分离。
比如不用软件运行在不同的操作系统上。
操作系统是一个维度,分为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#桥接模式详解的更多相关文章
- Linux下桥接模式详解一
注册博客园已经好长时间,一直以来也没有在上面写过文章,都是随意的记录在了未知笔记上,今天开始本着分享和学习的精神想把之前总结的笔记逐步分享到博客园,和大家一起学习,一起进步吧! 2016-09-20 ...
- Linux网络配置:Nat和桥接模式详解
Linux网络配置:Nat和桥接模式详解 一.我们首先说一下VMware的几个虚拟设备: Centos虚拟网络编辑器中的虚拟交换机: VMnet0:用于虚拟桥接网络下的虚拟交换机: VMnet1:用于 ...
- LInux下桥接模式详解三
上篇文章介绍了Linux内核桥接模式涉及到的几个结构,本节就重点放在数据包的处理上! 本节所有代码参考LInux 3.10.1内核! 前面已经提到一个数据包从网卡流到Linux内核中的L2层,最终被交 ...
- LInux下桥接模式详解二
上篇文章导入博客园的比较早,而这篇自己在写的时候才发现内部复杂的很,以至于没能按时完成,造成两篇文章的间隔时间有点长! 话不多说,言归正传! 前面的文章介绍了桥接模式下的基础理论知识,其实本节想结合L ...
- Docker:网络模式详解
Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...
- Docker网络模式详解
一.Docker四种工作模式 安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .hosthost:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用 ...
- docker 网络概述及网络模式详解
docker 网络概述及网络模式详解 1.网络概述 2.网络模式详解 1.网络概述: Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0) ...
- 【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现
[桥接设计模式详解]Java/JS/Go/Python/TS不同语言实现 简介 桥接模式(Bridge Pattern)是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的 ...
- Extjs MVC开发模式详解
Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...
- JavaScript严格模式详解
转载自阮一峰的博客 Javascript 严格模式详解 作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...
随机推荐
- 【Kubernetes】yaml文件编写 -- 持续更新
K8S通过yaml格式的声明式API与资源对象交互 API版本由apiVersion字段指定,API对象类型由kind字段指定 除此之外,每个API对象有三大类属性: metadata:元数据 spe ...
- 2023-07-20:假设一共有M个车库,编号1~M,时间点从早到晚是从1~T, 一共有N个记录,每一条记录如下{a, b, c}, 表示一辆车在b时间点进入a车库,在c时间点从a车库出去, 一共有K
2023-07-20:假设一共有M个车库,编号1 ~ M,时间点从早到晚是从1 ~ T, 一共有N个记录,每一条记录如下{a, b, c}, 表示一辆车在b时间点进入a车库,在c时间点从a车库出去, ...
- Centos静默安装Oracle11G
环境准备 Oracle 11gR2 64位 Linux版安装包 linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip ...
- Centos7中Oracle占用CPU过高(解决方案)
Centos7中Oracle占用CPU过高(解决方案) 前言: 99%的问题几乎都是SQL的问题,一般SQL可能会出现以下几种情况: 相关SQL搜索条件没有加索引 索引失效 联合查询过多 数据量过大 ...
- git: failed to push some refs to
错误原因 没有添加readme文件 解决方案 git pull --rebase origin master 至此问题解决
- Django CSRF cookie not set.
错误原因 由于django框架的settings.py配置了中间件,为了防止跨站请求伪造,form表单POST方式会导致出现报错 解决办法: 将'django.middleware.csrf.Csrf ...
- Abstract Factory 抽象工厂模式简介与 C# 示例【创建型1】【设计模式来了_1】
〇.简介 1.什么是抽象工厂模式? 一句话解释: 提供一个接口,以创建一系列相关或相互依赖的抽象对象,而无需指定它们具体的类.(将一系列抽象类装进接口,一次接口实现,就必须实例化这一系列抽象类) ...
- 部署安装kafka集群
准备 zookeeper节点: 172.50.13.103 172.50.13.104 172.50.13.105 kafka版本: 2.13-2.7.0 安装步骤 部署安装zookeeper集群.参 ...
- 2023牛客暑期多校训练营7 CGILM
比赛链接 C 题解 知识点:位运算,贪心. 我们用分段的思想考虑大小关系,若在同一段则大小不能确定,一开始为 \([1,n]\) . 我们按位从高到低考虑,某位如果 \(b_i\) 产生了 \(1\) ...
- 8.0 Python 使用进程与线程
python 进程与线程是并发编程的两种常见方式.进程是操作系统中的一个基本概念,表示程序在操作系统中的一次执行过程,拥有独立的地址空间.资源.优先级等属性.线程是进程中的一条执行路径,可以看做是轻量 ...