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 ...
随机推荐
- Flutter系列文章-Flutter环境搭建和Dart基础
Flutter是Google推出的一个开源的.高性能的移动应用开发框架,可以用一套代码库开发Android和iOS应用.Dart则是Flutter所使用的编程语言.让我们来看看如何搭建Flutter开 ...
- 最新基于nonebot的qq机器人搭建
导读 核心资源 ( 参考各项目到各自release下载 NoneBot简介 | go-cqhttp 帮助中心qq登录需要包签名,要自己部署 https://github.com/fuqiuluo/un ...
- 2021-7-6 new tcpip
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...
- 关于在Java中计算某个数的N次方注意事项
在实际过程中,我们会遇到计算某个数的N次方的情景,在书面上我们是可以记作 a^n ,然而在Java中我们却不能这样使用,因为在Java中,这样的写法是位运算,即 假设 A = 60, B = 13,他 ...
- 线上问题排查--进程重启失败,最后发现是忘了cd
背景 我前面写了几篇文章,讲c3p0数据库连接池发生了连接泄露,但是随机出现,难以确定根因,最终呢,为了快速解决问题,我是先写了个shell脚本,脚本主要是检测服务的接口访问日志,看看过去的30s内是 ...
- Golang之旅——内存管理
转载放在最前 一文带你了解,虚拟内存.内存分页.分段.段页式内存管理[Golang三关-典藏版]一站式Golang内存洗髓经 | Go 技术论坛 刘丹冰Aceld感谢以上文章作者,收获满满 存储器管理 ...
- Vue3 中 keepAlive 如何搭配 VueRouter 来更自由的控制页面的状态缓存?
在 vue 中,默认情况下,一个组件实例在被替换掉后会被销毁.这会导致它丢失其中所有已变化的状态--当这个组件再一次被显示时,会创建一个只带有初始状态的新实例.但是 vue 提供了 keep-aliv ...
- ABP Framework 7.4 RC 新增功能简介:增强微服务架构支持
ABP Framework 版本号:7.4.0-rc.1 发布时间:2023.8.16 阅读原文:ABP.IO Platform 7.4 RC Has Been Published 翻译:iEricL ...
- Facade Pattern and Encapsulation—— Structure Class
如果只看代码的话,应该可以说Facade pattern(门面设计模式)是一种最简单的代码结构,不就封装吗!这玩意谁不会! 还是看它背后所蕴含的思想吧,看了之后发现背后的思想也很简单,非常好理解. - ...
- 开源 SD-Small 和 SD-Tiny 知识蒸馏代码与权重
最近,人工智能社区在开发更大.更高性能的语言模型方面取得了显著的进展,例如 Falcon 40B.LLaMa-2 70B.Falcon 40B.MPT 30B; 以及在图像领域的模型,如 SD2.1 ...